#![cfg_attr(docsrs, doc(cfg(feature = "utils-serde")))]
#![cfg(feature = "utils-serde")]
use singlefile::{FileFormat, FileFormatUtf8};
use serde::de::{Deserialize, Deserializer};
use serde::ser::{Serialize, Serializer};
pub trait FormatAdapter<T> {
type Format: FileFormat<T>;
const FORMAT: Self::Format;
fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer {
Self::FORMAT.to_buffer(value)
.map_err(serde::ser::Error::custom)
.and_then(|buf| buf.serialize(serializer))
}
fn deserialize<'de, D>(deserializer: D) -> Result<T, D::Error>
where D: Deserializer<'de> {
<Vec<u8>>::deserialize(deserializer).and_then(|buf| {
Self::FORMAT.from_buffer(&buf).map_err(serde::de::Error::custom)
})
}
}
pub trait FormatAdapterText<T> {
type Format: FileFormatUtf8<T>;
const FORMAT: Self::Format;
fn serialize<S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer {
Self::FORMAT.to_string_buffer(value)
.map_err(serde::ser::Error::custom)
.and_then(|buf| buf.serialize(serializer))
}
fn deserialize<'de, D>(deserializer: D) -> Result<T, D::Error>
where D: Deserializer<'de> {
<String>::deserialize(deserializer).and_then(|buf| {
Self::FORMAT.from_string_buffer(&buf).map_err(serde::de::Error::custom)
})
}
}