Crate musli_descriptive
source ·Expand description
A fully self-descriptive format for Müsli.
Descriptive encoding is fully upgrade stable:
- ✔ Can tolerate missing fields if they are annotated with
#[musli(default)]. - ✔ Can skip over unknown fields.
Furthermore, it can be fully converted back and from to the Value type.
This means that it’s suitable as a wire and general interchange format, since the data model can evolve independently among clients. Once some clients are upgraded they will start sending unknown fields which non-upgraded clients will be forced to skip over for the duration of the upgrade.
use musli::{Encode, Decode};
#[derive(Debug, PartialEq, Encode, Decode)]
struct Version1 {
name: String,
}
#[derive(Debug, PartialEq, Encode, Decode)]
struct Version2 {
name: String,
#[musli(default)]
age: Option<u32>,
}
let version2 = musli_descriptive::to_vec(&Version2 {
name: String::from("Aristotle"),
age: Some(62),
})?;
let version1: Version1 = musli_descriptive::decode(version2.as_slice())?;
assert_eq!(version1, Version1 {
name: String::from("Aristotle"),
});Configuring
To configure the behavior of the wire format you can use the Encoding type:
use musli_descriptive::Encoding;
use musli::{Encode, Decode};
use musli::mode::DefaultMode;
const CONFIG: Encoding<DefaultMode> = Encoding::new();
#[derive(Debug, PartialEq, Encode, Decode)]
struct Struct<'a> {
name: &'a str,
age: u32,
}
let mut out = Vec::new();
let expected = Struct {
name: "Aristotle",
age: 61,
};
CONFIG.encode(&mut out, &expected)?;
let actual = CONFIG.decode(&out[..])?;
assert_eq!(expected, actual);Implementation details
Each field is prefix typed with a single byte tag that describes exactly the type which is contained in the field.
Re-exports
pub use self::encoding::to_vec;pub use self::encoding::to_writer;pub use self::encoding::decode;pub use self::encoding::encode;pub use self::encoding::from_slice;pub use self::encoding::to_fixed_bytes;pub use self::encoding::Encoding;
Modules
- Trait used to govern allocations. Trait used to handle individual buffer allocations.
- A writer which buffers the writes before it outputs it into the backing storage.
- Helper types to set up a basic Müsli
Context. - A container which can store up to a fixed number of uninitialized bytes on the stack and read into and from it.
- Traits and utilities for dealing with integers.
- Trait for governing how a particular source of bytes is read.
- Functions for working with strings. The exported implementations change depending on if the
simdutf8feature is enabled. - Type flags available for
musli-wire. - Helpers for integrating musli with I/O types like std::io and std::io::Write.
- Trait for governing how a particular sink of bytes is written to.
Structs
- Error raised during descriptive encoding.
Type Aliases
- Convenient result alias for use with
musli_descriptive.