Skip to main content

json_web_tolkien/
numeric_date.rs

1use serde::{Deserialize, de, ser};
2use std::time::Duration;
3
4pub struct NumericDate {}
5
6impl NumericDate {
7    pub fn deserialize<'de, D>(deserializer: D) -> Result<Duration, D::Error>
8    where
9        D: de::Deserializer<'de>,
10    {
11        let secs = u64::deserialize(deserializer)?;
12        let value = Duration::new(secs, 0);
13
14        Ok(value)
15    }
16
17    pub fn serialize<S>(value: &Duration, serializer: S) -> Result<S::Ok, S::Error>
18    where
19        S: ser::Serializer,
20    {
21        serializer.serialize_u64(value.as_secs())
22    }
23}
24
25#[cfg(test)]
26mod test {
27    use super::*;
28    use serde::Serialize;
29
30    #[derive(Deserialize, Serialize)]
31    struct Header {
32        #[serde(with = "NumericDate")]
33        issued_at: Duration,
34    }
35
36    #[test]
37    fn it_serailizes_and_deserializes_json() {
38        let input = r#"{"issued_at":1516239022}"#;
39
40        let header: Header = serde_json::from_str(input).unwrap();
41
42        assert_eq!(Duration::new(1516239022, 0), header.issued_at);
43
44        assert_eq!(input, serde_json::to_string(&header).unwrap())
45    }
46}