| Crates.io | versionneer |
| lib.rs | versionneer |
| version | 0.3.0 |
| created_at | 2025-07-12 13:13:42.911939+00 |
| updated_at | 2025-08-04 20:10:29.986091+00 |
| description | Version handling for serialization and deserialization |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1749284 |
| size | 59,391 |
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 });