#[cfg(test)]
mod tests;
use std::fmt;
use serde::{Deserialize, Serialize};
pub trait CustomSerialization {
fn serialize<T>(&self, value: &T) -> Result<Vec<u8>, CustomSerializationError>
where
T: ?Sized + Serialize;
fn deserialize<'a, T>(&self, s: &'a [u8]) -> Result<T, CustomSerializationError>
where
T: Deserialize<'a>;
}
pub struct CustomSerializationError;
impl fmt::Display for CustomSerializationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "An error occurred during the custom (de)serialization")
}
}
impl fmt::Debug for CustomSerializationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{{ file: {}, line: {} }}", file!(), line!())
}
}
pub struct DefaultSerialization {}
impl CustomSerialization for DefaultSerialization {
fn serialize<T>(&self, value: &T) -> Result<Vec<u8>, CustomSerializationError>
where
T: ?Sized + Serialize,
{
match flexbuffers::to_vec(value) {
Ok(vec) => Ok(vec),
Err(_) => Err(CustomSerializationError),
}
}
fn deserialize<'a, T>(&self, s: &'a [u8]) -> Result<T, CustomSerializationError>
where
T: Deserialize<'a>,
{
match flexbuffers::from_slice(s) {
Ok(val) => Ok(val),
Err(_) => Err(CustomSerializationError),
}
}
}