Super simple storage encoding for [Müsli]
The storage encoding is partially upgrade safe:
#[musli(default)]
.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};
struct Version1 { name: String, }
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, }); ```
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
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); ```