Skip to main content

canic_host/format/
mod.rs

1//! Host-side formatting helpers shared by operator tools.
2
3pub use canic_core::shared_support::format::{byte_size, cycles_tc};
4
5/// Format the IC-relevant uncompressed wasm size, with gzip size as secondary.
6#[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/// Format a duration in compact largest units for CLI tables and summaries.
17#[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;