roowho2_lib/util/
duration_serde.rs1pub 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}