1use std::fmt::{self, Display, Formatter};
2use std::time::Duration;
3
4#[derive(Clone, Copy, Debug)]
5pub struct DurationDisplay(pub Duration);
6
7impl Display for DurationDisplay {
8 fn fmt(&self, formatter: &mut Formatter<'_>) -> fmt::Result {
9 let nanos = self.0.as_secs() * 1_000_000_000u64 + u64::from(self.0.subsec_nanos());
10 if nanos < 1000 {
11 write!(formatter, "{}ns", nanos)
12 } else if nanos < 10_000_000 {
13 write!(formatter, "{:.3}us", (nanos as f64) / 1_000.)
14 } else if nanos < 1_000_000_000 {
15 write!(formatter, "{:.3}ms", (nanos as f64) / 1_000_000.)
16 } else {
17 write!(formatter, "{:.3}s", (nanos as f64) / 1_000_000_000.)
18 }
19 }
20}
21
22pub trait DurationExt {
23 fn as_milliseconds(&self) -> u128;
24}
25
26impl DurationExt for Duration {
27 fn as_milliseconds(&self) -> u128 {
28 u128::from(self.as_secs()) * 1000 + u128::from(self.subsec_nanos()) / 1_000_000
29 }
30}