serde-versions-derive

Crates.ioserde-versions-derive
lib.rsserde-versions-derive
version0.0.5
sourcesrc
created_at2021-05-31 06:00:23.983699
updated_at2021-06-21 06:13:38.598912
descriptionAn attribute macro for adding a version byte when serializing a struct via Serde. Also allows deseraializing while removing version byte.
homepage
repository
max_upload_size
id404069
size11,815
Willem Olding (willemolding)

documentation

README

Serde Versions Derive

serde_versions_derive exports an attribute macro that adds versioning support for structs.

When serializing a named field struct it will automatically add a new field containing the version. It also allows deserializing the versioned type directly back to the unversioned one.

Under the hood this works by creating a new struct that wraps the original struct plus adds a version byte field.

Internally this new struct uses #[serde(flatten)] to serialize as expected. The original struct uses #[serde(to, from)] to add the version field when serializing and remove it when deserializing.

usage:

#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S {
    i: i32,
}

This produces the following

#[derive(Clone, Serialize, Deserialize)]
#[serde(into = "_Sv3", from = "_Sv3")]
struct S {
    i: i32,
}

#[derive(Clone, Serialize, Deserialize)]
struct _Sv3 {
    version: u8,
    #[serde(flatten)]
    inner: S
}

// plus implementations of To, From and to_versioned() for S

and will Serialize to:

{
	"version": 3,
	"i": 0
}

This supports types with type parameters however these must have a trait bound to implement Clone

e.g.:

# use serde::{Deserialize, Serialize};
# use serde_versions_derive::version;
#[version(3)]
#[derive(Clone, Serialize, Deserialize)]
struct S<T: Clone> {
    t: T,
} 
Commit count: 0

cargo fmt