1#[cfg(feature = "chrono")]
2use chrono;
3
4use serde::ser::SerializeSeq;
5use serde::Serializer;
6
7pub 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}