1
pub mod duration_seconds {
2
    use chrono::TimeDelta;
3
    use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
4

            
5
    pub fn serialize<S: Serializer>(
6
        duration: &TimeDelta,
7
        serializer: S,
8
    ) -> Result<S::Ok, S::Error> {
9
        duration.num_seconds().serialize(serializer)
10
    }
11

            
12
    pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<TimeDelta, D::Error> {
13
        let secs = i64::deserialize(deserializer)?;
14
        TimeDelta::try_seconds(secs).ok_or_else(|| Error::custom("duration out of range"))
15
    }
16
}
17

            
18
pub mod duration_seconds_option {
19
    use chrono::TimeDelta;
20
    use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
21

            
22
    pub fn serialize<S: Serializer>(
23
        duration: &Option<TimeDelta>,
24
        serializer: S,
25
    ) -> Result<S::Ok, S::Error> {
26
        duration.map(|d| d.num_seconds()).serialize(serializer)
27
    }
28

            
29
    pub fn deserialize<'de, D: Deserializer<'de>>(
30
        deserializer: D,
31
    ) -> Result<Option<TimeDelta>, D::Error> {
32
        let secs = Option::<i64>::deserialize(deserializer)?;
33
        secs.map(|secs| {
34
            TimeDelta::try_seconds(secs).ok_or_else(|| Error::custom("duration out of range"))
35
        })
36
        .transpose()
37
    }
38
}