# musli-storage [github](https://github.com/udoprog/musli) [crates.io](https://crates.io/crates/musli-storage) [docs.rs](https://docs.rs/musli-storage) [build status](https://github.com/udoprog/musli/actions?query=branch%3Amain) Super simple storage encoding for [Müsli] The storage encoding is partially upgrade safe: * ✔ Can tolerate missing fields if they are annotated with `#[musli(default)]`. * ✗ Cannot skip over extra unrecognized fields. 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 = musli_storage::to_vec(&Version2 { name: String::from("Aristotle"), age: Some(62), })?; assert!(musli_storage::decode::<_, Version1>(version2.as_slice()).is_err()); let version1 = musli_storage::to_vec(&Version1 { name: String::from("Aristotle"), })?; let version2: Version2 = musli_storage::decode(version1.as_slice())?; 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 musli::mode::Binary; use musli::{Encode, Decode}; use musli_utils::options::{self, Options, Integer}; use musli_storage::Encoding; const OPTIONS: Options = options::new().with_integer(Integer::Fixed).build(); const CONFIG: Encoding = Encoding::new().with_options(); #[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); ``` [default encoding format]: https://docs.rs/musli-storage/latest/musli-storage/struct.Encoding.html [musli-wire]: https://docs.rs/musli-wire [Müsli]: https://docs.rs/musli [`Encoding`]: https://docs.rs/musli-storage/latest/musli-storage/struct.Encoding.html