macro_rules! string_serde {
($ty:ty, $name:literal) => {
impl serde::Serialize for $ty {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.collect_str(self)
}
}
impl<'de> serde::Deserialize<'de> for $ty {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let raw = <String as serde::Deserialize>::deserialize(deserializer)?;
raw.parse().map_err(serde::de::Error::custom)
}
}
impl schemars::JsonSchema for $ty {
fn schema_name() -> std::borrow::Cow<'static, str> {
$name.into()
}
fn json_schema(_generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({ "type": "string" })
}
}
};
}
pub(crate) use string_serde;