Skip to main content

mcpr_core/
time.rs

1//! Time formatting utilities shared across mcpr crates.
2
3/// Format a latency value in microseconds for human-readable display.
4///
5/// Three display tiers:
6/// - **< 1ms** (< 1,000μs): `"142μs"`
7/// - **1ms..1s** (1,000..1,000,000μs): `"4.20ms"` (two decimal places)
8/// - **≥ 1s** (≥ 1,000,000μs): `"1,234ms"` (comma-separated, no decimals)
9///
10/// # Examples
11///
12/// ```
13/// use mcpr_core::time::format_latency_us;
14///
15/// assert_eq!(format_latency_us(200), "200μs");
16/// assert_eq!(format_latency_us(4_200), "4.20ms");
17/// assert_eq!(format_latency_us(1_500_000), "1,500ms");
18/// ```
19pub fn format_latency_us(us: i64) -> String {
20    if us < 1_000 {
21        format!("{us}μs")
22    } else {
23        let ms = us as f64 / 1_000.0;
24        if ms >= 1_000.0 {
25            let ms_int = (ms + 0.5) as i64;
26            format!("{},{:03}ms", ms_int / 1000, ms_int % 1000)
27        } else {
28            format!("{ms:.2}ms")
29        }
30    }
31}
32
33#[cfg(test)]
34#[allow(non_snake_case)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn format_latency_us__sub_ms() {
40        assert_eq!(format_latency_us(0), "0μs");
41        assert_eq!(format_latency_us(1), "1μs");
42        assert_eq!(format_latency_us(200), "200μs");
43        assert_eq!(format_latency_us(999), "999μs");
44    }
45
46    #[test]
47    fn format_latency_us__ms_range() {
48        assert_eq!(format_latency_us(1_000), "1.00ms");
49        assert_eq!(format_latency_us(1_500), "1.50ms");
50        assert_eq!(format_latency_us(4_200), "4.20ms");
51        assert_eq!(format_latency_us(10_250), "10.25ms");
52        assert_eq!(format_latency_us(142_000), "142.00ms");
53        assert_eq!(format_latency_us(500_000), "500.00ms");
54    }
55
56    #[test]
57    fn format_latency_us__seconds_range() {
58        assert_eq!(format_latency_us(1_000_000), "1,000ms");
59        assert_eq!(format_latency_us(1_500_000), "1,500ms");
60        assert_eq!(format_latency_us(4_201_000), "4,201ms");
61        assert_eq!(format_latency_us(12_345_000), "12,345ms");
62    }
63
64    #[test]
65    fn format_latency_us__boundary_us_to_ms() {
66        assert_eq!(format_latency_us(999), "999μs");
67        assert_eq!(format_latency_us(1_000), "1.00ms");
68    }
69
70    #[test]
71    fn format_latency_us__boundary_ms_to_s() {
72        assert_eq!(format_latency_us(999_999), "1000.00ms");
73        assert_eq!(format_latency_us(1_000_000), "1,000ms");
74    }
75}