versionneer

Crates.ioversionneer
lib.rsversionneer
version0.3.0
created_at2025-07-12 13:13:42.911939+00
updated_at2025-08-04 20:10:29.986091+00
descriptionVersion handling for serialization and deserialization
homepage
repository
max_upload_size
id1749284
size59,391
Heinz N. Gies (Licenser)

documentation

https://docs.rs/versionneer

README

versionneer Build Status Latest Version codecov

A simple version management crate for encoded data that allows for simple versioning and upgrading of data structures.

   use versionneer::{versioned, Encodable, Decodable, bincode, Upgrade};

   #[derive(Debug, thiserror::Error)]
   enum Error {
       #[error("Invalid version: {0}")]
       InvalidVersion(u32),
       #[error(transparent)]
       Decode(#[from] ::bincode::error::DecodeError),
       #[error(transparent)]
       Encoder(#[from] ::bincode::error::EncodeError),
   }
   impl versionneer::Error for Error {
       fn invalid_version(version: u32) -> Self {
           Self::InvalidVersion(version)
       }
   }

   #[derive(Debug, PartialEq, Eq, ::bincode::Decode, ::bincode::Encode)]
   struct TestV0 {
       data: u8,
   }
   versioned!(TestV0, 0, Error);

   #[derive(Debug, PartialEq, Eq, ::bincode::Decode, ::bincode::Encode)]
   struct TestV1 {
       data: u16,
   }
   versioned!(TestV1, 1, Error);

   impl TryFrom<TestV0> for TestV1 {
       type Error = Error;
       fn try_from(value: TestV0) -> Result<Self, Self::Error> {
           Ok(TestV1 { data: u16::from(value.data) })
       }
   }

   type Latest = Upgrade<TestV1, TestV0, Error>;
   let mut data = Vec::new();
   let mut enc = bincode::Encoder::new(&mut data);
   let test = TestV0 { data: 42 };
   TestV0::encode(&test, &mut enc).expect("Failed to encode");
   let mut reader = data.as_slice();
   let mut dec = bincode::Decoder::new(&mut reader);
   let decoded = Latest::decode(&mut dec).expect("Failed to decode");
   assert_eq!(decoded, TestV1 { data: 42 });
Commit count: 0

cargo fmt