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}