use crate::error::RestoreError;
pub trait MigrateFrom<Old>: Sized {
fn migrate(old: Old) -> Self;
}
pub trait Versioned: Sized {
const VERSION: u32;
fn restore_versioned(bytes: &[u8]) -> Result<Self, RestoreError>;
}
#[cfg(feature = "restore")]
pub mod rt {
use crate::error::RestoreError;
use serde::Deserialize;
use serde_json::Value;
#[derive(Deserialize)]
struct Envelope {
version: u32,
payload: Value,
}
pub fn parse_envelope(bytes: &[u8]) -> Result<(u32, Value), RestoreError> {
let env: Envelope = serde_json::from_slice(bytes).map_err(|e| RestoreError::Decode {
version: 0,
source: Box::new(e),
})?;
Ok((env.version, env.payload))
}
pub fn decode<T>(version: u32, payload: Value) -> Result<T, RestoreError>
where
T: for<'de> Deserialize<'de>,
{
serde_json::from_value(payload).map_err(|e| RestoreError::Decode {
version,
source: Box::new(e),
})
}
pub fn newer_than_binary(found: u32, supports: u32) -> RestoreError {
RestoreError::NewerThanBinary { found, supports }
}
pub fn unknown_version(found: u32) -> RestoreError {
RestoreError::UnknownVersion { found }
}
}