use chrono::DateTime;
use chrono::Utc;
use serde::{Deserialize, Deserializer, Serializer};
pub const FORMAT: &'static str = "%Y-%m-%d %z";
pub fn serialize<S>(date: &Option<DateTime<Utc>>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
match date {
Some(ref val) => {
let s = format!("{}", val.format(FORMAT));
serializer.serialize_str(&s)
}
None => serializer.serialize_none(),
}
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
where
D: Deserializer<'de>,
{
let s = Option::<String>::deserialize(deserializer)?;
match s {
Some(ref val) => DateTime::parse_from_str(val, FORMAT)
.map(|item| Some(item.to_utc()))
.map_err(serde::de::Error::custom),
None => Ok(None),
}
}