use crate::{DeserializeWith, SerializeWith};
use core::marker::PhantomData;
use serde::{Deserializer, Serializer};
pub struct Codec<F, G>(PhantomData<(F, G)>);
impl<F, G> Codec<F, G> {
pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
where
T: ?Sized,
S: Serializer,
Self: SerializeWith<T>,
{
Self::serialize_with(value, serializer)
}
pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
Self: DeserializeWith<'de, T>,
{
Self::deserialize_with(deserializer)
}
}
impl<F, G, T> SerializeWith<T> for Codec<F, G>
where
F: SerializeWith<T>,
T: ?Sized,
{
fn serialize_with<S: Serializer>(value: &T, serializer: S) -> Result<S::Ok, S::Error> {
F::serialize_with(value, serializer)
}
}
impl<'de, F, G, T> DeserializeWith<'de, T> for Codec<F, G>
where
G: DeserializeWith<'de, T>,
{
fn deserialize_with<D>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
{
G::deserialize_with(deserializer)
}
}