timber_rust/config/
duration.rs

1use serde::{Deserialize, Serialize};
2use std::time::Duration;
3
4#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
5pub enum FlexibleDuration {
6    Seconds(u64),
7    DecimalSeconds(f64),
8    SecondsNanoseconds(u64, u32),
9}
10
11impl From<FlexibleDuration> for Duration {
12    fn from(value: FlexibleDuration) -> Self {
13        match value {
14            FlexibleDuration::Seconds(seconds) => Duration::new(seconds, 0),
15            FlexibleDuration::DecimalSeconds(seconds) => {
16                let secs = seconds.floor() as u64;
17                let nsecs = (seconds.fract() * 1e9) as u32;
18                Duration::new(secs, nsecs)
19            }
20            FlexibleDuration::SecondsNanoseconds(secs, nsecs) => Duration::new(secs, nsecs),
21        }
22    }
23}
24
25impl From<Duration> for FlexibleDuration {
26    fn from(value: Duration) -> Self {
27        FlexibleDuration::SecondsNanoseconds(value.as_secs(), value.subsec_nanos())
28    }
29}