xet_runtime/utils/
output_bytes.rs1pub fn output_bytes(v: u64) -> String {
6 let map = vec![
7 (1_099_511_627_776, "TiB"),
8 (1_073_741_824, "GiB"),
9 (1_048_576, "MiB"),
10 (1024, "KiB"),
11 ];
12
13 if v == 0 {
14 return "0 bytes".to_string();
15 }
16
17 for (div, s) in map {
18 let curr = v as f64 / div as f64;
19 if v / div > 0 {
20 return if v.is_multiple_of(div) {
21 format!("{} {}", v / div, s)
22 } else {
23 format!("{curr:.2} {s}")
24 };
25 }
26 }
27
28 format!("{v} bytes")
29}
30
31#[cfg(test)]
32mod tests {
33 use super::*;
34
35 #[test]
36 fn test_size_conversion() {
37 assert_eq!("500 bytes", output_bytes(500));
38 assert_eq!("999 bytes", output_bytes(999));
39 assert_eq!("1 KiB", output_bytes(1024));
40 assert_eq!("1.00 KiB", output_bytes(1025));
41 assert_eq!("999.99 KiB", output_bytes(1_023_989));
42 assert_eq!("1 MiB", output_bytes(1_048_576));
43 assert_eq!("1.00 MiB", output_bytes(1048577));
44 assert_eq!("999.99 MiB", output_bytes(1_048_565_514));
45 assert_eq!("1 GiB", output_bytes(1_073_741_824));
46 assert_eq!("1.00 GiB", output_bytes(1_073_741_825));
47 assert_eq!("999.99 GiB", output_bytes(1_073_731_086_581));
48 assert_eq!("1 TiB", output_bytes(1_099_511_627_776));
49 assert_eq!("1.00 TiB", output_bytes(1_099_511_627_777));
50 assert_eq!("1234.57 TiB", output_bytes(1_357_424_070_303_416));
51 }
52}