Skip to main content

roowho2_lib/util/
duration_serde.rs

1pub 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
18pub 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}