#[cfg(feature = "chrono")]
pub mod chrono;
pub mod ipv4;
#[cfg(feature = "time")]
pub mod time;
#[cfg(feature = "uuid")]
pub mod uuid;
macro_rules! option_module {
($ty:ty) => {
pub mod option {
use ::serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize<S>(value: &Option<$ty>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
struct AsParent<'a>(&'a $ty);
impl Serialize for AsParent<'_> {
fn serialize<S2>(&self, serializer: S2) -> Result<S2::Ok, S2::Error>
where
S2: Serializer,
{
super::serialize(self.0, serializer)
}
}
match value {
Some(v) => serializer.serialize_some(&AsParent(v)),
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<$ty>, D::Error>
where
D: Deserializer<'de>,
{
struct FromParent($ty);
impl<'de> Deserialize<'de> for FromParent {
fn deserialize<D2>(deserializer: D2) -> Result<Self, D2::Error>
where
D2: Deserializer<'de>,
{
super::deserialize(deserializer).map(FromParent)
}
}
Ok(Option::<FromParent>::deserialize(deserializer)?.map(|w| w.0))
}
}
};
}
pub(crate) use option_module;