use serde::{Deserializer, Serializer};
use serde_with::{DeserializeAs, SerializeAs};
pub trait CustomSerdeTrait: Sized + serde::Serialize + for<'de> serde::Deserialize<'de> {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serde::Serialize::serialize(&self, serializer)
}
fn deserialize<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
<Self as serde::Deserialize>::deserialize(deserializer)
}
}
pub struct EvmCompatSerde;
impl<T: CustomSerdeTrait> SerializeAs<T> for EvmCompatSerde {
fn serialize_as<S>(source: &T, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
<T as CustomSerdeTrait>::serialize(source, serializer)
}
}
impl<'de, T: CustomSerdeTrait> DeserializeAs<'de, T> for EvmCompatSerde {
fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
{
<T as CustomSerdeTrait>::deserialize(deserializer)
}
}