use std::str::FromStr;
use serde::{Deserialize as _, Deserializer, Serializer};
use crate::EnumStr;
pub mod enum_str {
use super::*;
pub fn serialize<S, T>(t: &T, se: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: EnumStr,
{
se.serialize_str(t.as_name())
}
pub fn deserialize<'de, D, T>(de: D) -> Result<T, D::Error>
where
D: Deserializer<'de>,
T: FromStr,
T::Err: std::error::Error,
{
let s = String::deserialize(de)?;
T::from_str(&s).map_err(serde::de::Error::custom)
}
}
pub mod option_enum_str {
use super::*;
pub fn serialize<S, T>(t: &Option<T>, se: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
T: EnumStr,
{
match t {
Some(x) => se.serialize_str(x.as_name()),
None => se.serialize_none(),
}
}
pub fn deserialize<'de, D, T>(de: D) -> Result<Option<T>, D::Error>
where
D: Deserializer<'de>,
T: FromStr,
T::Err: std::error::Error,
{
let s = <Option<String>>::deserialize(de)?;
s.map(|s| T::from_str(&s).map_err(serde::de::Error::custom))
.transpose()
}
}