zebra_chain/fmt/
time.rs

1//! Human-readable formats for times and durations.
2
3use std::time::Duration;
4
5/// The minimum amount of time displayed with only seconds (no milliseconds).
6pub const MIN_SECONDS_ONLY_TIME: Duration = Duration::from_secs(5);
7
8/// Returns a human-friendly formatted string for the whole number of seconds in `duration`.
9pub fn duration_short(duration: impl Into<Duration>) -> String {
10    let duration = duration.into();
11
12    if duration >= MIN_SECONDS_ONLY_TIME {
13        humantime_seconds(duration)
14    } else {
15        humantime_milliseconds(duration)
16    }
17}
18
19// TODO: rename these functions to duration_*
20
21/// Returns a human-friendly formatted string for the whole number of seconds in `duration`.
22pub fn humantime_seconds(duration: impl Into<Duration>) -> String {
23    let duration = duration.into();
24
25    // Truncate fractional seconds.
26    let duration = Duration::from_secs(duration.as_secs());
27
28    let duration = humantime::format_duration(duration);
29
30    format!("{duration}")
31}
32
33/// Returns a human-friendly formatted string for the whole number of milliseconds in `duration`.
34pub fn humantime_milliseconds(duration: impl Into<Duration>) -> String {
35    let duration = duration.into();
36
37    // Truncate fractional seconds.
38    let duration_secs = Duration::from_secs(duration.as_secs());
39    let duration_millis = Duration::from_millis(duration.subsec_millis().into());
40
41    let duration = humantime::format_duration(duration_secs + duration_millis);
42
43    format!("{duration}")
44}