pipebase/common/
time.rs

1use serde::{Deserialize, Serialize};
2use std::time::Duration;
3
4#[derive(Clone, Deserialize)]
5pub enum Period {
6    Millis(i64),
7    Secs(i64),
8    Minutes(i64),
9    Hours(i64),
10    Days(i64),
11}
12
13impl From<Period> for Duration {
14    fn from(period: Period) -> Self {
15        match period {
16            Period::Millis(m) => Duration::from_millis(m as u64),
17            Period::Secs(s) => Duration::from_secs(s as u64),
18            Period::Minutes(m) => Duration::from_secs((m as u64) * 60),
19            Period::Hours(h) => Duration::from_secs((h as u64) * 3600),
20            Period::Days(d) => Duration::from_secs((d as u64) * 3600 * 3600),
21        }
22    }
23}
24
25#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
26pub enum Timestamp {
27    Millis(u64),
28    Secs(u64),
29}
30
31pub mod date_time_without_timezone {
32    use chrono::NaiveDateTime;
33    use serde::{self, Deserialize, Deserializer, Serializer};
34
35    const FORMAT: &str = "%Y-%m-%d %H:%M:%S";
36
37    pub fn serialize<S>(date_time: &NaiveDateTime, serializer: S) -> Result<S::Ok, S::Error>
38    where
39        S: Serializer,
40    {
41        let s = format!("{}", date_time.format(FORMAT));
42        serializer.serialize_str(&s)
43    }
44
45    pub fn deserialize<'de, D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
46    where
47        D: Deserializer<'de>,
48    {
49        let s = String::deserialize(deserializer)?;
50        NaiveDateTime::parse_from_str(&s, FORMAT).map_err(serde::de::Error::custom)
51    }
52}
53
54#[cfg(test)]
55mod tests {
56    use crate::prelude::*;
57    use chrono::{NaiveDate, NaiveDateTime};
58    use serde::{Deserialize, Serialize};
59
60    #[derive(Serialize, Deserialize)]
61    pub struct Metric {
62        #[serde(with = "date_time_without_timezone")]
63        pub timestamp: NaiveDateTime,
64    }
65
66    #[test]
67    fn test_datetime_without_timezone() {
68        let json_str = r#"{
69  "timestamp": "2017-02-16 21:54:30"
70}"#;
71        let metric: Metric = serde_json::from_str(json_str).unwrap();
72        let ts = &metric.timestamp;
73        assert_eq!(ts, &NaiveDate::from_ymd(2017, 2, 16).and_hms(21, 54, 30));
74        let serialized = serde_json::to_string_pretty(&metric).unwrap();
75        assert_eq!(json_str, serialized.as_str());
76    }
77}