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/// The minimum amount of time displayed with only seconds and milliseconds (no microseconds).
9pub const MIN_MS_ONLY_TIME: Duration = Duration::from_millis(5);
10
11/// Returns a human-friendly formatted string for the whole number of seconds in `duration`.
12pub fn duration_short(duration: impl Into<Duration>) -> String {
13    let duration = duration.into();
14
15    if duration >= MIN_SECONDS_ONLY_TIME {
16        humantime_seconds(duration)
17    } else if duration >= MIN_MS_ONLY_TIME {
18        humantime_milliseconds(duration)
19    } else {
20        humantime_microseconds(duration)
21    }
22}
23
24// TODO: rename these functions to duration_*
25
26/// Returns a human-friendly formatted string for the whole number of seconds in `duration`.
27pub fn humantime_seconds(duration: impl Into<Duration>) -> String {
28    let duration = duration.into();
29
30    // Truncate fractional seconds.
31    let duration = Duration::from_secs(duration.as_secs());
32
33    let duration = humantime::format_duration(duration);
34
35    format!("{duration}")
36}
37
38/// Returns a human-friendly formatted string for the whole number of milliseconds in `duration`.
39pub fn humantime_milliseconds(duration: impl Into<Duration>) -> String {
40    let duration = duration.into();
41
42    // Truncate fractional seconds.
43    let duration_secs = Duration::from_secs(duration.as_secs());
44    let duration_millis = Duration::from_millis(duration.subsec_millis().into());
45
46    let duration = humantime::format_duration(duration_secs + duration_millis);
47
48    format!("{duration}")
49}
50
51/// Returns a human-friendly formatted string for the whole number of microseconds in `duration`.
52pub fn humantime_microseconds(duration: impl Into<Duration>) -> String {
53    let duration = duration.into();
54
55    // Truncate fractional seconds.
56    let duration_secs = Duration::from_secs(duration.as_secs());
57    let duration_millis = Duration::from_millis(duration.subsec_millis().into());
58    let duration_micros = Duration::from_micros(duration.subsec_micros().into());
59
60    let duration = humantime::format_duration(duration_secs + duration_millis + duration_micros);
61
62    format!("{duration}")
63}