pro-serde-versioned
This crate provides a simple method for versioning and upgrading data structures
when serialized via [serde
].
VersionedSerialize
and VersionedDeserialize
traits allow deriving
stable serialization methods for an enum, which will still work if new enum
cases are added in the futureVersionedUpgrade
trait defines a enum sequence of struct generations by
providing a method to upgrade any struct in the sequence to the latest.VersionedSerialize
/VersionedDeserialize
Examples```rust use serde::{Deserialize, Serialize}; use proserdeversioned::{ VersionedSerialize, VersionedDeserialize, };
// Let's say you have two generations of some serialized data structure ...
struct MyStructV1 { field: String };
struct MyStructV2 { field1: u32, new_field: String, }
// Derive [VersionedSerialize
] and [VersionedDeserialize
]
VersionedSerialize,
VersionedDeserialize,
Debug,
PartialEq,
Clone
)] enum MyStructVersioned { V1(MyStructV1), V2(MyStructV2), }
let versionedstruct: MyStructVersioned = MyStructV1 { field: "123".tostring() }.into();
// Serializing MyStructV1
to serde_json::Value
format
let serializedv1: serdejson::Value = versionedstruct.versionedserialize()?;
// Deserialize MyStructVersion
from JSON format
let deserializedv1 = MyStructVersioned::versioneddeserialize(&serializedv1)?;
asserteq!(deserializedv1, versionedstruct);
```
VersionedUpgrade
Examples```rust use proserdeversioned::{ VersionedUpgrade, Upgrade, };
// Given the same two generations of a serialized data structure ...
struct MyStructV1(String);
struct MyStructV2 { field1: u32, new_field: String, }
// ... and an impl for the Upgrade
trait which links them together ...
impl Upgrade
// Derive the [VersionedUpgrade
] trait on a wrapper enum
VersionedUpgrade,
Debug,
PartialEq,
Clone
)] enum MyStructVersion { V1(MyStructV1), V2(MyStructV2), }
// Now any struct can be upgraded to the latest enum of [MyStructVersioned
]!
// Upgrade MyStructV1
to MyStructV2
.
let upgradedv2 =
MyStructVersion::V1(MyStructV1("123".tostring())).upgradetolatest();
asserteq!( upgradedv2, MyStructV2 { field1: 123, newfield: "defaultvalue".to_string(), } );
```