pub mod date_time_format {
use chrono::{DateTime, TimeZone, Utc};
use serde::{self, Deserialize, Deserializer};
const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
pub fn deserialize<'de, D>(deserializer: D) -> Result<DateTime<Utc>, D::Error>
where
D: Deserializer<'de>,
{
let s: String = String::deserialize(deserializer)?;
match Utc.datetime_from_str(&s, FORMAT) {
Ok(t) => Ok(t),
Err(_) => match serde_json::from_str::<DateTime<Utc>>(&format!("\"{}\"", s)) {
Ok(t) => Ok(t),
Err(e) => Err(serde::de::Error::custom(format!(
"deserializing {} as DateTime<Utc> failed: {}",
s, e
))),
},
}
}
}
pub mod nullable_date_time_format {
use chrono::{DateTime, TimeZone, Utc};
use serde::{self, Deserialize, Deserializer};
const FORMAT: &str = "%Y-%m-%dT%H:%M:%S";
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<DateTime<Utc>>, D::Error>
where
D: Deserializer<'de>,
{
let s: Option<String> = Option::deserialize(deserializer)?;
if let Some(s) = s {
match Utc.datetime_from_str(&s, FORMAT) {
Ok(t) => Ok(Some(t)),
Err(_) => match serde_json::from_str::<DateTime<Utc>>(&format!("\"{}\"", s)) {
Ok(t) => Ok(Some(t)),
Err(e) => Err(serde::de::Error::custom(format!(
"deserializing {} as DateTime<Utc> failed: {}",
s, e
))),
},
}
} else {
Ok(None)
}
}
}