ddapi_rs/scheme/
mod.rs

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