json_web_tolkien/
numeric_date.rs1use 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}