From 5ff2c515da36dce3c3a7ec447f155326ed2b960d Mon Sep 17 00:00:00 2001 From: Maciej Myszkiewicz Date: Sun, 11 Oct 2026 08:51:37 +0200 Subject: [PATCH] chore: the metadata crates.io needs, and a README for each crate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit None of the four publishable crates had `keywords`, `categories` or a `readme`. The effect is not cosmetic: without categories a crate does not appear when anyone browses crates.io by subject, and without a readme its page is the description and nothing else. `aerospace::space-protocols` is the category for all four — it is also the key the AeroRust catalogue collects entries by — with a second one each for what the crate is: a parser, an encoder, a development tool, a command-line utility. The READMEs are short and say the thing that is true of that crate rather than repeating the workspace: that `xtce-decode` is tested packet for packet against the Python reference on nine streams, that `xtce-codegen` refuses rather than falls back, that `xtce model` keeps everything it cannot decode so a real mission database still loads. `cargo publish -p xtce-model --dry-run` packages 19 files cleanly. The other three cannot be dry-run until their dependencies exist on crates.io, which is the order they would be published in anyway. --- crates/xtce-cli/Cargo.toml | 3 +++ crates/xtce-cli/README.md | 14 ++++++++++++++ crates/xtce-codegen/Cargo.toml | 3 +++ crates/xtce-codegen/README.md | 14 ++++++++++++++ crates/xtce-decode/Cargo.toml | 3 +++ crates/xtce-decode/README.md | 19 +++++++++++++++++++ crates/xtce-model/Cargo.toml | 3 +++ crates/xtce-model/README.md | 15 +++++++++++++++ 8 files changed, 74 insertions(+) create mode 100644 crates/xtce-cli/README.md create mode 100644 crates/xtce-codegen/README.md create mode 100644 crates/xtce-decode/README.md create mode 100644 crates/xtce-model/README.md diff --git a/crates/xtce-cli/Cargo.toml b/crates/xtce-cli/Cargo.toml index 7649f4c..4eb1c3d 100644 --- a/crates/xtce-cli/Cargo.toml +++ b/crates/xtce-cli/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-cli" description = "Command-line tools for inspecting and decoding CCSDS telemetry defined by XTCE" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "cli"] +categories = ["aerospace::space-protocols", "command-line-utilities"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-cli/README.md b/crates/xtce-cli/README.md new file mode 100644 index 0000000..4f93e93 --- /dev/null +++ b/crates/xtce-cli/README.md @@ -0,0 +1,14 @@ +# xtce-cli + +The `xtce` command: inspect an XTCE definition and decode a CCSDS stream against it. + +```console +$ xtce info mission.xml # what it contains, and what cannot be decoded +$ xtce decode mission.xml downlink.dat # values, as a table or as JSON lines +$ xtce decode mission.xml downlink.dat --param 'ADGPSPOS*' +``` + +`--param` takes a glob, and a value matching nothing in the definition is an error naming the +nearest parameter rather than an empty report. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-codegen/Cargo.toml b/crates/xtce-codegen/Cargo.toml index c81b1a7..7b01a5b 100644 --- a/crates/xtce-codegen/Cargo.toml +++ b/crates/xtce-codegen/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-codegen" description = "Compile an XTCE telemetry definition into a static Rust decoder" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "codegen", "spacecraft"] +categories = ["aerospace::space-protocols", "development-tools"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-codegen/README.md b/crates/xtce-codegen/README.md new file mode 100644 index 0000000..8fe21d8 --- /dev/null +++ b/crates/xtce-codegen/README.md @@ -0,0 +1,14 @@ +# xtce-codegen + +Compiles an XTCE definition into a `struct` per container whose `decode` is a sequence of +loads, shifts and masks with every offset already a literal. Nothing consults the XTCE model at +run time. + +Measured against the interpreted decoder in the same repository on the same 7 200-packet +stream: roughly 100× it, which is about 11 000× the Python reference. + +Refusals are fatal by design. A construct the generator cannot compile is refused with the +element named, rather than falling back to interpretation — a silent fallback would make the +measurement above meaningless. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-decode/Cargo.toml b/crates/xtce-decode/Cargo.toml index 97519cc..e33dacd 100644 --- a/crates/xtce-decode/Cargo.toml +++ b/crates/xtce-decode/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-decode" description = "Decode CCSDS telemetry packets against an XTCE definition" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "decoder"] +categories = ["aerospace::space-protocols", "encoding"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-decode/README.md b/crates/xtce-decode/README.md new file mode 100644 index 0000000..d990124 --- /dev/null +++ b/crates/xtce-decode/README.md @@ -0,0 +1,19 @@ +# xtce-decode + +Decodes CCSDS space packets against an XTCE definition, and is tested the only way that means +anything: packet for packet against +[`lasp/space_packet_parser`](https://github.com/lasp/space_packet_parser), the Python +implementation, over nine recorded mission streams. Where the two disagree, this crate is wrong +until proven otherwise — and the handful of deliberate divergences are listed, with reasons, in +the repository's `SUPPORTED.md`. + +Measured at roughly 100× that reference on decode. + +* **No panics.** Every failure is a `DecodeError`; a corrupt or hostile packet must not take + down a process sitting on a live downlink. +* **No allocation for aligned reads.** Byte-aligned binary and string fields borrow straight + from the packet. +* **Raw and engineering values both kept.** XTCE treats them as distinct and restriction + criteria may test either. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs). diff --git a/crates/xtce-model/Cargo.toml b/crates/xtce-model/Cargo.toml index 0a4fd8e..ba12755 100644 --- a/crates/xtce-model/Cargo.toml +++ b/crates/xtce-model/Cargo.toml @@ -1,6 +1,9 @@ [package] name = "xtce-model" description = "XTCE telemetry metadata: streaming XML parser and arena-backed intermediate representation" +readme = "README.md" +keywords = ["xtce", "ccsds", "telemetry", "spacecraft", "parser"] +categories = ["aerospace::space-protocols", "parser-implementations"] version.workspace = true edition.workspace = true rust-version.workspace = true diff --git a/crates/xtce-model/README.md b/crates/xtce-model/README.md new file mode 100644 index 0000000..2d4a70e --- /dev/null +++ b/crates/xtce-model/README.md @@ -0,0 +1,15 @@ +# xtce-model + +Reads an XTCE `SpaceSystem` document into `XtceDb`: a flat, index-addressed model that +[`xtce-decode`](https://crates.io/crates/xtce-decode) walks to decode CCSDS packets, and that +`xtce-codegen` compiles into static Rust decoders. + +Streaming XML through `quick-xml`, an arena behind every entity, and a `u32` newtype instead of +a pointer — which keeps the model `Send + Sync`, makes cloning cheap, and turns following a +reference into an array index. + +Only `TelemetryMetaData` is modelled. Constructs outside the decodable subset are still +*represented*, so loading a real mission database never fails merely because part of it is out +of scope; the error comes later, from the decoder, at the point a value actually depends on it. + +Part of [RustSpaceLab/xtce-rs](https://github.com/RustSpaceLab/xtce-rs).