use crate::error::ErrorKind;
use crate::preclude::SerdeDiff;
use serde::{Deserialize, Serialize};
#[cfg(feature = "bincode-serialization")]
pub mod bincode;
#[cfg(feature = "rmp-serialization")]
pub mod rmp;
pub trait SerializationStrategy: Clone + Default + Send + Sync {
fn serialize<I: Serialize>(&self, input: &I) -> Result<Vec<u8>, ErrorKind>;
fn deserialize<'a, T: Deserialize<'a>>(&self, buffer: &'a [u8]) -> Result<T, ErrorKind>;
fn apply_to<C: SerdeDiff>(&self, component: &mut C, data: &[u8]) -> Result<(), ErrorKind>;
}
#[derive(Clone, Debug, PartialOrd, PartialEq)]
pub struct ModificationSerializer<S: SerializationStrategy> {
strategy: S,
}
impl<S: SerializationStrategy> ModificationSerializer<S> {
pub fn new(strategy: S) -> ModificationSerializer<S> {
ModificationSerializer { strategy }
}
pub fn serialize<I: Serialize>(&self, input: &I) -> Result<Vec<u8>, ErrorKind> {
self.strategy.serialize(input)
}
pub fn deserialize<'a, T: Deserialize<'a>>(&self, buffer: &'a [u8]) -> Result<T, ErrorKind> {
self.strategy.deserialize(buffer)
}
}
impl<S: SerializationStrategy> Default for ModificationSerializer<S> {
fn default() -> Self {
ModificationSerializer::new(Default::default())
}
}