pub fn format_bytes(bytes: u64) -> String {
const KB: u64 = 1024;
const MB: u64 = KB * 1024;
const GB: u64 = MB * 1024;
const TB: u64 = GB * 1024;
if bytes >= TB {
format!("{:.2} TB", bytes as f64 / TB as f64)
} else if bytes >= GB {
format!("{:.2} GB", bytes as f64 / GB as f64)
} else if bytes >= MB {
format!("{:.2} MB", bytes as f64 / MB as f64)
} else if bytes >= KB {
format!("{:.2} KB", bytes as f64 / KB as f64)
} else {
format!("{} B", bytes)
}
}
pub fn format_speed(bytes_per_sec: f64) -> String {
const KB: f64 = 1024.0;
const MB: f64 = KB * 1024.0;
const GB: f64 = MB * 1024.0;
if bytes_per_sec >= GB {
format!("{:.2} GB/s", bytes_per_sec / GB)
} else if bytes_per_sec >= MB {
format!("{:.2} MB/s", bytes_per_sec / MB)
} else if bytes_per_sec >= KB {
format!("{:.2} KB/s", bytes_per_sec / KB)
} else {
format!("{:.0} B/s", bytes_per_sec)
}
}
pub fn format_duration(secs: f64) -> String {
if secs < 1.0 {
format!("{:.0}ms", secs * 1000.0)
} else if secs < 60.0 {
format!("{:.2}s", secs)
} else if secs < 3600.0 {
let mins = (secs / 60.0).floor();
let rem_secs = secs % 60.0;
format!("{}m {:.0}s", mins, rem_secs)
} else {
let hours = (secs / 3600.0).floor();
let mins = ((secs % 3600.0) / 60.0).floor();
format!("{}h {}m", hours, mins)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_format_bytes() {
assert_eq!(format_bytes(0), "0 B");
assert_eq!(format_bytes(1023), "1023 B");
assert_eq!(format_bytes(1024), "1.00 KB");
assert_eq!(format_bytes(1536), "1.50 KB");
assert_eq!(format_bytes(2732), "2.67 KB"); assert_eq!(format_bytes(1_048_576), "1.00 MB");
assert_eq!(format_bytes(1_073_741_824), "1.00 GB");
assert_eq!(format_bytes(1_099_511_627_776), "1.00 TB");
}
#[test]
fn test_format_speed() {
assert_eq!(format_speed(0.0), "0 B/s");
assert_eq!(format_speed(1023.0), "1023 B/s");
assert_eq!(format_speed(1024.0), "1.00 KB/s");
assert_eq!(format_speed(152.5), "152 B/s");
assert_eq!(format_speed(1_048_576.0), "1.00 MB/s");
assert_eq!(format_speed(1_073_741_824.0), "1.00 GB/s");
}
#[test]
fn test_format_duration() {
assert_eq!(format_duration(0.5), "500ms");
assert_eq!(format_duration(1.5), "1.50s");
assert_eq!(format_duration(17.94), "17.94s");
assert_eq!(format_duration(65.0), "1m 5s");
assert_eq!(format_duration(3665.0), "1h 1m");
}
}