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