serde_nanos/
ser.rs

1#[cfg(feature = "chrono")]
2use chrono;
3
4use serde::ser::SerializeSeq;
5use serde::Serializer;
6
7/// Types that can be serialized via `#[serde(with = "serde_nanos")]`.
8pub trait Serialize {
9    #[allow(missing_docs)]
10    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
11    where
12        S: Serializer;
13}
14
15impl Serialize for std::time::Duration {
16    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
17    where
18        S: Serializer,
19    {
20        let nanoseconds = self.as_nanos() as i64;
21        serializer.serialize_i64(nanoseconds)
22    }
23}
24
25impl Serialize for Option<std::time::Duration> {
26    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27    where
28        S: Serializer,
29    {
30        struct Data<'a, V: 'a>(&'a V)
31        where
32            V: Serialize;
33
34        impl<'a, V: Serialize + 'a> serde::Serialize for Data<'a, V> {
35            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
36            where
37                S: Serializer,
38            {
39                self.0.serialize(serializer)
40            }
41        }
42
43        match *self {
44            Some(ref value) => serializer.serialize_some(&Data(value)),
45            None => serializer.serialize_none(),
46        }
47    }
48}
49
50impl Serialize for Vec<std::time::Duration> {
51    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
52    where
53        S: Serializer,
54    {
55        let mut seq = serializer.serialize_seq(Some(self.len()))?;
56        for e in self {
57            let nanos = e.as_nanos() as i64;
58            seq.serialize_element(&nanos)?;
59        }
60        seq.end()
61    }
62}
63
64#[cfg(feature = "chrono")]
65impl Serialize for chrono::Duration {
66    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
67    where
68        S: Serializer,
69    {
70        let nanoseconds = self.num_nanoseconds().unwrap();
71        serializer.serialize_i64(nanoseconds)
72    }
73}
74
75#[cfg(feature = "chrono")]
76impl Serialize for Option<chrono::Duration> {
77    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
78    where
79        S: Serializer,
80    {
81        struct Data<'a, V: 'a>(&'a V)
82        where
83            V: Serialize;
84
85        impl<'a, V: Serialize + 'a> serde::Serialize for Data<'a, V> {
86            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
87            where
88                S: Serializer,
89            {
90                self.0.serialize(serializer)
91            }
92        }
93
94        match *self {
95            Some(ref value) => serializer.serialize_some(&Data(value)),
96            None => serializer.serialize_none(),
97        }
98    }
99}
100
101#[cfg(feature = "chrono")]
102impl Serialize for Vec<chrono::Duration> {
103    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
104    where
105        S: Serializer,
106    {
107        let mut seq = serializer.serialize_seq(Some(self.len()))?;
108        for e in self {
109            let nanos = e.as_nanos() as i64;
110            seq.serialize_element(&nanos)?;
111        }
112        seq.end()
113    }
114}