use std::fmt::Debug;
use serde::{de::DeserializeOwned, Serialize};
pub trait Formatter: Debug {
const ID: &'static str;
type Error: std::error::Error;
type Serialized;
fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error>;
fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error>;
}
#[derive(Debug, Clone, Copy, Default)]
pub struct PostcardFormatter;
impl Formatter for PostcardFormatter {
const ID: &'static str = "postcard";
type Error = postcard::Error;
type Serialized = Vec<u8>;
fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error> {
postcard::to_stdvec(value)
}
fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error> {
postcard::from_bytes(value)
}
}
#[cfg(feature = "serde_json")]
#[derive(Debug, Clone, Copy, Default)]
pub struct JsonFormatter;
#[cfg(feature = "serde_json")]
impl Formatter for JsonFormatter {
const ID: &'static str = "json";
type Error = serde_json::Error;
type Serialized = String;
fn serialize<T: Serialize>(&self, value: &T) -> Result<Self::Serialized, Self::Error> {
serde_json::to_string(value)
}
fn deserialize<T: DeserializeOwned>(&self, value: &Self::Serialized) -> Result<T, Self::Error> {
serde_json::from_str(value)
}
}