ddapi_rs/scheme/
mod.rs

1use chrono::{DateTime, NaiveDateTime, Utc};
2use serde::de::{self, Visitor};
3use serde::{Deserializer, Serializer};
4use std::fmt;
5
6pub mod ddnet;
7pub mod ddstats;
8
9fn serialize_datetime_timestamp<S>(date: &NaiveDateTime, serializer: S) -> Result<S::Ok, S::Error>
10where
11    S: Serializer,
12{
13    serializer.serialize_i64(date.and_utc().timestamp())
14}
15
16fn deserialize_datetime_timestamp<'de, D>(deserializer: D) -> Result<NaiveDateTime, D::Error>
17where
18    D: Deserializer<'de>,
19{
20    struct NaiveDateTimeVisitor;
21
22    impl<'de> Visitor<'de> for NaiveDateTimeVisitor {
23        type Value = NaiveDateTime;
24
25        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
26            formatter.write_str("a string or a floating point number")
27        }
28
29        fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
30        where
31            E: de::Error,
32        {
33            if value < 0 {
34                return Err(E::custom("invalid timestamp: must be non-negative"));
35            }
36
37            let datetime: DateTime<Utc> =
38                DateTime::from_timestamp(value, 0).unwrap_or_else(Utc::now);
39            Ok(datetime.naive_utc())
40        }
41
42        fn visit_f64<E>(self, value: f64) -> Result<Self::Value, E>
43        where
44            E: de::Error,
45        {
46            let timestamp = value as i64;
47            if timestamp < 0 {
48                return Err(E::custom("invalid timestamp: must be non-negative"));
49            }
50
51            let datetime: DateTime<Utc> =
52                DateTime::from_timestamp(timestamp, 0).unwrap_or_else(Utc::now);
53            Ok(datetime.naive_utc())
54        }
55    }
56
57    deserializer.deserialize_any(NaiveDateTimeVisitor)
58}