pro-serde-versioned

This crate provides a simple method for versioning and upgrading data structures when serialized via [serde].

Features

VersionedSerialize/VersionedDeserialize Examples

```rust use serde::{Deserialize, Serialize}; use proserdeversioned::{ VersionedSerialize, VersionedDeserialize, };

// Let's say you have two generations of some serialized data structure ...

[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]

struct MyStructV1 { field: String };

[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]

struct MyStructV2 { field1: u32, new_field: String, }

// Derive [VersionedSerialize] and [VersionedDeserialize]

[derive(

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);

Ok::<(), Box>(())

```

VersionedUpgrade Examples

```rust use proserdeversioned::{ VersionedUpgrade, Upgrade, };

// Given the same two generations of a serialized data structure ...

[derive(Debug, PartialEq, Clone)]

struct MyStructV1(String);

[derive(Debug, PartialEq, Clone)]

struct MyStructV2 { field1: u32, new_field: String, }

// ... and an impl for the Upgrade trait which links them together ... impl Upgrade for MyStructV1 { fn upgrade(self: MyStructV1) -> MyStructV2 { MyStructV2 { field1: self.0.parse().unwrapordefault(), newfield: "defaultvalue".to_string(), } } }

// Derive the [VersionedUpgrade] trait on a wrapper enum

[derive(

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(), } );

Ok::<(), Box>(())

```