1macro_rules! define_time_format {
2 ( $(#[$docs:meta])*
3 $time:ident($format:literal)
4 ) => {
5 $(#[$docs])*
6 pub mod $time {
7 use chrono::NaiveDateTime;
8 use serde::{Deserialize, Deserializer, Serializer};
9
10 static FORMAT: &str = $format;
11
12 pub fn serialize<S>(
13 date: &Option<NaiveDateTime>,
14 serializer: S,
15 ) -> Result<S::Ok, S::Error>
16 where
17 S: Serializer,
18 {
19 if let Some(date) = date {
20 let s = format!("{}", date.format(FORMAT));
21 serializer.serialize_str(&s)
22 } else {
23 serializer.serialize_none()
24 }
25 }
26
27 pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<NaiveDateTime>, D::Error>
28 where
29 D: Deserializer<'de>,
30 {
31 let s = String::deserialize(deserializer)?;
32 NaiveDateTime::parse_from_str(&s, FORMAT)
33 .map_err(|err| {
34 serde::de::Error::custom(format!("Failed to parse date: {} {} ", s, err))
35 })
36 .map(Some)
37 }
38 }
39 };
40}
41define_time_format!(
42 standard_time("%Y%m%d%H%M%S")
46);
47define_time_format!(
48 snapshot_time("%Y%m%d.%H%M%S")
52);