use chrono::{DateTime, TimeZone, Utc};
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize_option_datefmt<S: Serializer>(
time: &DateTime<Utc>,
serializer: S,
) -> Result<S::Ok, S::Error> {
time.to_rfc3339().serialize(serializer)
}
const FORMAT: &str = "%Y-%m-%d %H:%M:%S";
fn datefmt<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
Utc.datetime_from_str(&s, FORMAT)
.map_err(serde::de::Error::custom)
}
pub fn deserialize_option_datefmt<'de, D>(
deserializer: D,
) -> Result<Option<DateTime<Utc>>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
struct Wrapper(#[serde(deserialize_with = "datefmt")] DateTime<Utc>);
let v = Option::deserialize(deserializer)?;
Ok(v.map(|Wrapper(a)| a))
}