use std::error::Error;
use std::ffi::OsStr;
use dyn_clone::DynClone;
use serde::de::DeserializeOwned;
use crate::DatabaseEntry;
pub trait Format: DynClone + std::any::Any {
fn file_ext(&self) -> &OsStr;
fn serialize_dyn(
&self,
value: &dyn DatabaseEntry,
) -> Result<Vec<u8>, Box<dyn Error + Send + Sync>>;
fn deserialize_dyn(
&self,
bytes: &[u8],
) -> Result<Box<dyn DatabaseEntry>, Box<dyn Error + Send + Sync>>;
fn deserialize<T: DeserializeOwned>(
&self,
bytes: &[u8],
) -> Result<T, Box<dyn Error + Send + Sync>>
where
Self: Sized;
}
dyn_clone::clone_trait_object!(Format);
#[cfg(feature = "serde_yaml")]
#[derive(Clone, Copy, Debug)]
pub struct SerdeYaml;
#[cfg(feature = "serde_yaml")]
impl Format for SerdeYaml {
fn file_ext(&self) -> &OsStr {
return OsStr::new("yaml");
}
fn serialize_dyn(
&self,
value: &dyn DatabaseEntry,
) -> Result<Vec<u8>, Box<dyn Error + Send + Sync>> {
let value = serde_yaml::to_string(value)?;
return Ok(value.into_bytes());
}
fn deserialize_dyn(
&self,
bytes: &[u8],
) -> Result<Box<dyn DatabaseEntry>, Box<dyn Error + Send + Sync>> {
let str = std::str::from_utf8(bytes)?;
let value = serde_yaml::from_str(str)?;
return Ok(value);
}
fn deserialize<T: DeserializeOwned>(
&self,
bytes: &[u8],
) -> Result<T, Box<dyn Error + Send + Sync>> {
let str = std::str::from_utf8(bytes)?;
let value = serde_yaml::from_str(str)?;
return Ok(value);
}
}
#[cfg(feature = "serde_json")]
#[derive(Clone, Copy, Debug)]
pub struct SerdeJson;
#[cfg(feature = "serde_json")]
impl Format for SerdeJson {
fn file_ext(&self) -> &OsStr {
return OsStr::new("json");
}
fn serialize_dyn(
&self,
value: &dyn DatabaseEntry,
) -> Result<Vec<u8>, Box<dyn Error + Send + Sync>> {
let value = serde_json::to_string(value)?;
return Ok(value.into_bytes());
}
fn deserialize_dyn(
&self,
bytes: &[u8],
) -> Result<Box<dyn DatabaseEntry>, Box<dyn Error + Send + Sync>> {
let str = std::str::from_utf8(bytes)?;
let value = serde_json::from_str(str)?;
return Ok(value);
}
fn deserialize<T: DeserializeOwned>(
&self,
bytes: &[u8],
) -> Result<T, Box<dyn Error + Send + Sync>> {
let str = std::str::from_utf8(bytes)?;
let value = serde_json::from_str(str)?;
return Ok(value);
}
}