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}