#![doc = include_str!("../README.md")]
mod formats;
#[cfg(feature = "derive")]
pub use pro_serde_versioned_derive::{VersionedDeserialize, VersionedSerialize, VersionedUpgrade};
use serde::{Deserialize, Serialize};
pub use crate::formats::*;
pub trait VersionedUpgrade {
type Latest;
fn upgrade_to_latest(self) -> Self::Latest;
}
pub trait Upgrade<To> {
fn upgrade(self) -> To;
}
pub trait VersionedSerialize {
type VersionedEnvelope<F: Serialize>: Serialize;
fn to_envelope<F>(&self) -> Result<Self::VersionedEnvelope<F>, F::Error>
where
F: SerializeFormat;
fn versioned_serialize<F>(&self) -> Result<F, F::Error>
where
F: SerializeFormat,
{
Ok(F::serialize_format(self.to_envelope::<F>()?)?)
}
}
pub trait VersionedDeserialize: Sized + Clone {
type VersionedEnvelope<'a, F: Deserialize<'a>>: Deserialize<'a>;
fn from_envelope<'a, F>(data: &Self::VersionedEnvelope<'a, F>) -> Result<Self, F::Error>
where
F: DeserializeFormat + Deserialize<'a>;
fn versioned_deserialize<'a, F>(data: &'a F) -> Result<Self, F::Error>
where
F: DeserializeFormat + Deserialize<'a>,
{
let envelope: Self::VersionedEnvelope<'a, F> = F::deserialize_format(data)?;
Self::from_envelope(&envelope)
}
}
pub trait SerializeFormat: Sized + Serialize {
type Error: serde::ser::Error;
fn serialize_format<T>(data: T) -> Result<Self, Self::Error>
where
T: Serialize;
}
pub trait DeserializeFormat: Sized {
type Error: serde::de::Error;
fn deserialize_format<'a, T>(&'a self) -> Result<T, Self::Error>
where
T: Deserialize<'a>;
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct VersionedEnvelope<T> {
pub version_number: usize,
pub data: T,
}