Skip to main content

xet_runtime/utils/
output_bytes.rs

1/// Convert a usize into an output string, choosing the nearest byte prefix.
2///
3/// # Arguments
4/// * `v` - the size in bytes
5pub 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}