| Crates.io | spud_rs |
| lib.rs | spud_rs |
| version | 0.8.2 |
| created_at | 2025-05-26 07:06:55.312414+00 |
| updated_at | 2025-07-20 13:31:57.928374+00 |
| description | A Rust library for parsing the SPUD binary format. |
| homepage | |
| repository | https://github.com/MarelGuy/spud_rs |
| max_upload_size | |
| id | 1689053 |
| size | 203,538 |
SPUD is a custom binary file format for efficient storage and transmission of structured data. It uses type tags and field name interning for compactness. This implementation is written in Rust.
null, bool, signed/unsigned integers (i8–i64, u8–u64), f32, f64, String, and raw binary blobs (Vec<u8>).[0xDE, 0xAD, 0xBE, 0xEF]).serde.A .spud file consists of:
(length, field_name_bytes, id) entries, ending with 0x01.(field_id, type_tag, value_bytes) entries. Strings/blobs include length. Arrays/objects are delimited by start/end tags.0xDE, 0xAD, 0xBE, 0xEF.You can build SPUD files manually or by serializing Rust structs with serde.
```rust
use spud::spud_builder::SpudBuilder;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut builder = SpudBuilder::new();
builder.object(|obj| {
obj.field("name", "Example Object")?;
obj.field("version", 1u8)?;
obj.field("enabled", true)?;
obj.field("description", Option::<String>::None)?;
obj.field("value", 123.45f64)?;
obj.field("raw_data", vec![0x01, 0x02, 0x03, 0x04])?;
Ok(())
})?;
builder.build_file("output_dir", "my_spud_data")?;
Ok(())
}
use spud::spud_builder::SpudBuilder;
use serde::Serialize;
#[derive(Serialize)]
struct MyData {
name: String,
version: u8,
enabled: bool,
description: Option<String>,
value: f64,
raw_data: Vec<u8>,
}
let data = MyData {
name: "Example Object".to_string(),
version: 1,
enabled: true,
description: None,
value: 123.45,
raw_data: vec![0x01, 0x02, 0x03, 0x04],
};
let mut builder = SpudBuilder::from_serde(&data);
builder.build_file("output_dir", "my_spud_data").unwrap();
You can decode SPUD files manually or deserialize them into Rust structs with serde.
use spud::spud_decoder::SpudDecoder;
let mut decoder = SpudDecoder::new_from_path("output_dir/my_spud_data.spud").unwrap();
let data = decoder.decode().unwrap();
println!("{:?}", data);
use spud::spud_decoder::SpudDecoder;
use serde::Deserialize;
#[derive(Deserialize, Debug)]
struct MyData {
name: String,
version: u8,
enabled: bool,
description: Option<String>,
value: f64,
raw_data: Vec<u8>,
}
let mut decoder = SpudDecoder::new_from_path("output_dir/my_spud_data.spud").unwrap();
let data: MyData = decoder.deserialize().unwrap();
println!("{:?}", data);
serde integration for SpudBuilder and SpudDecoder.spud filesSome minor bugs may exist; please report any issues.
Contributions are welcome! Open an issue or submit a pull request.