Skip to main content

hypixel/models/
common.rs

1use serde_json::{Map, Value};
2
3/// An arbitrary JSON object preserved verbatim from the API.
4pub type JsonObject = Map<String, Value>;
5
6/// Millisecond Unix timestamps as delivered by the API, parsed to `chrono`.
7pub mod millis {
8    use chrono::{DateTime, TimeZone, Utc};
9    use serde::{Deserialize, Deserializer, Serializer};
10
11    pub fn serialize<S: Serializer>(value: &DateTime<Utc>, ser: S) -> Result<S::Ok, S::Error> {
12        ser.serialize_i64(value.timestamp_millis())
13    }
14
15    pub mod option {
16        use super::*;
17
18        pub fn serialize<S: Serializer>(
19            value: &Option<DateTime<Utc>>,
20            ser: S,
21        ) -> Result<S::Ok, S::Error> {
22            match value {
23                Some(v) => super::serialize(v, ser),
24                None => ser.serialize_none(),
25            }
26        }
27
28        pub fn deserialize<'de, D: Deserializer<'de>>(
29            de: D,
30        ) -> Result<Option<DateTime<Utc>>, D::Error> {
31            let raw = Option::<i64>::deserialize(de)?;
32            Ok(raw.and_then(|ms| Utc.timestamp_millis_opt(ms).single()))
33        }
34    }
35}