musli-storage

github crates.io docs.rs build status

Super simple storage encoding for [Müsli]

The storage encoding is partially upgrade safe:

This means that it's suitable as a storage format, since the data model only evolves in one place. But unsuitable as a wire format since it cannot allow clients to upgrade independent of each other.

See [musli-wire] for a fully upgrade safe format.

```rust 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, }

let version2 = muslistorage::tobuffer(&Version2 { name: String::from("Aristotle"), age: Some(62), })?;

assert!(muslistorage::decode::<_, Version1>(version2.asslice()).is_err());

let version1 = muslistorage::tobuffer(&Version1 { name: String::from("Aristotle"), })?;

let version2: Version2 = muslistorage::decode(version1.asslice())?;

assert_eq!(version2, Version2 { name: String::from("Aristotle"), age: None, }); ```


Configuring

To tweak the behavior of the storage format you can use the [Encoding] type:

```rust use muslistorage::Encoding; use muslistorage::int::{Fixed, Variable}; use musli::mode::DefaultMode; use musli::{Encode, Decode};

const CONFIG: Encoding = Encoding::new() .withfixedintegers();

[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); ```