use serde::{Deserialize, Deserializer, Serialize, Serializer};
use super::singleton_map;
use crate::yaml::value::Value;
pub(crate) fn serialize<T, S>(
value: &Option<T>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
T: Serialize,
S: Serializer,
{
match value {
None => serializer.serialize_none(),
Some(inner) => singleton_map::serialize(inner, serializer),
}
}
pub(crate) fn deserialize<'de, T, D>(
deserializer: D,
) -> Result<Option<T>, D::Error>
where
T: Deserialize<'de>,
D: Deserializer<'de>,
{
let v = Value::deserialize(deserializer)?;
match v {
Value::Null => Ok(None),
other => {
let converted = singleton_map::from_singleton_map(other);
T::deserialize(converted)
.map(Some)
.map_err(serde::de::Error::custom)
}
}
}