maven_rs/utils/
time.rs

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 format
43    ///
44    /// Format: `%Y%m%d%H%M%S`
45    standard_time("%Y%m%d%H%M%S")
46);
47define_time_format!(
48    /// Snapshot time format
49    ///
50    /// Format: `%Y%m%d.%H%M%S`
51    snapshot_time("%Y%m%d.%H%M%S")
52);