# musli-wire [github](https://github.com/udoprog/musli) [crates.io](https://crates.io/crates/musli-wire) [docs.rs](https://docs.rs/musli-wire) [build status](https://github.com/udoprog/musli/actions?query=branch%3Amain) Fully upgrade stable format for [Müsli] suitable for network communication. Wire encoding is fully upgrade stable: * ✔ Can tolerate missing fields if they are annotated with `#[musli(default)]`. * ✔ Can skip over unknown fields. This means that it's suitable as a wire 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. ```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_wire::to_vec(&Version2 { name: String::from("Aristotle"), age: Some(62), })?; let version1: Version1 = musli_wire::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: ```rust use musli::{Encode, Decode}; use musli_utils::options::{self, Options, Integer}; use musli_wire::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); ```
## Implementation details Each field is prefix *typed* with a single byte tag that allows a receiver to figure out exactly how much should be skipped over. Packed items are prefix-length encoded, and have a limited size. Its exact length is defined by [MAX_INLINE_LEN] and can be modified with [Encoding::with_max_pack]. [default encoding format]: https://docs.rs/musli-wire/latest/musli-wire/struct.Encoding.html [MAX_INLINE_LEN]: https://docs.rs/musli-wire/latest/musli_wire/tag/constant.MAX_INLINE_LEN.html [Müsli]: https://docs.rs/musli [Encoding::with_max_pack]: https://docs.rs/musli-wire/latest/musli_wire/encoding/struct.Encoding.html#method.with_max_pack [`Encoding`]: https://docs.rs/musli-wire/latest/musli-wire/struct.Encoding.html