1pub use canic_core::__control_plane_core::format::{byte_size, cycles_tc};
4
5#[must_use]
7pub fn wasm_size_label(wasm_bytes: Option<u64>, gzip_bytes: Option<u64>) -> String {
8 match (wasm_bytes, gzip_bytes) {
9 (Some(wasm), Some(gzip)) => format!("{} (gz {})", byte_size(wasm), byte_size(gzip)),
10 (Some(wasm), None) => byte_size(wasm),
11 (None, Some(gzip)) => format!("n/a (gz {})", byte_size(gzip)),
12 (None, None) => "-".to_string(),
13 }
14}
15
16#[must_use]
18pub fn compact_duration(seconds: u64) -> String {
19 const MINUTE: u64 = 60;
20 const HOUR: u64 = 60 * MINUTE;
21 const DAY: u64 = 24 * HOUR;
22 const WEEK: u64 = 7 * DAY;
23
24 match seconds {
25 0 => "0s".to_string(),
26 1..MINUTE => format!("{seconds}s"),
27 MINUTE..HOUR => compact_duration_pair(seconds, MINUTE, "m", 1, "s"),
28 HOUR..DAY => compact_duration_pair(seconds, HOUR, "h", MINUTE, "m"),
29 DAY..WEEK => compact_duration_pair(seconds, DAY, "d", HOUR, "h"),
30 _ => compact_duration_pair(seconds, WEEK, "w", DAY, "d"),
31 }
32}
33
34fn compact_duration_pair(
35 seconds: u64,
36 major_seconds: u64,
37 major_unit: &str,
38 minor_seconds: u64,
39 minor_unit: &str,
40) -> String {
41 let major = seconds / major_seconds;
42 let minor = (seconds % major_seconds) / minor_seconds;
43 if minor == 0 {
44 format!("{major}{major_unit}")
45 } else {
46 format!("{major}{major_unit} {minor}{minor_unit}")
47 }
48}
49
50#[cfg(test)]
51mod tests {
52 use super::{compact_duration, wasm_size_label};
53
54 #[test]
56 fn formats_wasm_size_labels() {
57 assert_eq!(
58 wasm_size_label(Some(2 * 1024 * 1024), Some(512 * 1024)),
59 "2.00 MiB (gz 512.00 KiB)"
60 );
61 assert_eq!(wasm_size_label(Some(2 * 1024 * 1024), None), "2.00 MiB");
62 assert_eq!(
63 wasm_size_label(None, Some(512 * 1024)),
64 "n/a (gz 512.00 KiB)"
65 );
66 assert_eq!(wasm_size_label(None, None), "-");
67 }
68
69 #[test]
71 fn formats_compact_durations() {
72 assert_eq!(compact_duration(0), "0s");
73 assert_eq!(compact_duration(45), "45s");
74 assert_eq!(compact_duration(90), "1m 30s");
75 assert_eq!(compact_duration(7_230), "2h");
76 assert_eq!(compact_duration(9_000), "2h 30m");
77 assert_eq!(compact_duration(97_200), "1d 3h");
78 assert_eq!(compact_duration(1_555_200), "2w 4d");
79 }
80}