cargo_checkmate/
duration.rs

1use humantime::{format_duration, FormattedDuration};
2use std::time::Instant;
3
4pub(crate) struct DurationTracker(Instant);
5
6impl DurationTracker {
7    pub(crate) fn start() -> Self {
8        DurationTracker(Instant::now())
9    }
10
11    pub(crate) fn finish(self) -> Duration {
12        let raw_duration = Instant::now().duration_since(self.0);
13        let ms = u64::try_from(raw_duration.as_millis()).unwrap();
14        Duration(std::time::Duration::from_millis(ms))
15    }
16}
17
18pub(crate) struct Duration(std::time::Duration);
19
20impl Duration {
21    pub(crate) fn format_human(self) -> FormattedDuration {
22        format_duration(self.0)
23    }
24
25    pub(crate) fn format_seconds(self) -> String {
26        let s = self.into_ms_f64();
27        format!("{s:>7.3} seconds")
28    }
29
30    fn into_ms_f64(self) -> f64 {
31        // 2^32 ms is ~49 days:
32        u32::try_from(self.0.as_millis())
33            .map(|ms| f64::from(ms) / 1000f64)
34            .unwrap_or(f64::INFINITY)
35    }
36}