timber_rust 2.0.1

A high-performance, asynchronous logging library with support for Grafana Loki and AWS CloudWatch.
use serde::{Deserialize, Serialize};
use std::time::Duration;

#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
pub enum FlexibleDuration {
    Seconds(u64),
    DecimalSeconds(f64),
    SecondsNanoseconds(u64, u32),
}

impl From<FlexibleDuration> for Duration {
    fn from(value: FlexibleDuration) -> Self {
        match value {
            FlexibleDuration::Seconds(seconds) => Duration::new(seconds, 0),
            FlexibleDuration::DecimalSeconds(seconds) => {
                let secs = seconds.floor() as u64;
                let nsecs = (seconds.fract() * 1e9) as u32;
                Duration::new(secs, nsecs)
            }
            FlexibleDuration::SecondsNanoseconds(secs, nsecs) => Duration::new(secs, nsecs),
        }
    }
}

impl From<Duration> for FlexibleDuration {
    fn from(value: Duration) -> Self {
        FlexibleDuration::SecondsNanoseconds(value.as_secs(), value.subsec_nanos())
    }
}