git.lucas.co / cce-files
file manager
git clone https://git.lucas.co/cce-files.git

src/util.rs (1.8K)

 1 //! Small formatting helpers shared across pages and services.
 2 
 3 /// Format a byte count as a short human-readable size (e.g. `1.5 M`).
 4 pub fn format_size(size: u64) -> String {
 5     if size < 1024 {
 6         format!("{} B", size)
 7     } else if size < 1024 * 1024 {
 8         format!("{:.1} K", size as f64 / 1024.0)
 9     } else if size < 1024 * 1024 * 1024 {
10         format!("{:.1} M", size as f64 / (1024.0 * 1024.0))
11     } else {
12         format!("{:.1} G", size as f64 / (1024.0 * 1024.0 * 1024.0))
13     }
14 }
15 
16 /// Format a Unix mode into a 10-character `drwxr-xr-x`-style permission string.
17 pub fn format_permissions(mode: u32) -> String {
18     let mut s = String::with_capacity(10);
19     s.push(if mode & 0o40000 != 0 { 'd' } else { '-' });
20     s.push(if mode & 0o400 != 0 { 'r' } else { '-' });
21     s.push(if mode & 0o200 != 0 { 'w' } else { '-' });
22     s.push(if mode & 0o100 != 0 { 'x' } else { '-' });
23     s.push(if mode & 0o040 != 0 { 'r' } else { '-' });
24     s.push(if mode & 0o020 != 0 { 'w' } else { '-' });
25     s.push(if mode & 0o010 != 0 { 'x' } else { '-' });
26     s.push(if mode & 0o004 != 0 { 'r' } else { '-' });
27     s.push(if mode & 0o002 != 0 { 'w' } else { '-' });
28     s.push(if mode & 0o001 != 0 { 'x' } else { '-' });
29     s
30 }
31 
32 #[cfg(test)]
33 mod tests {
34     use super::*;
35 
36     #[test]
37     fn format_size_units() {
38         assert_eq!(format_size(0), "0 B");
39         assert_eq!(format_size(512), "512 B");
40         assert_eq!(format_size(1024), "1.0 K");
41         assert_eq!(format_size(1048576), "1.0 M");
42         assert_eq!(format_size(1073741824), "1.0 G");
43     }
44 
45     #[test]
46     fn format_permissions_string() {
47         assert_eq!(format_permissions(0o40755), "drwxr-xr-x");
48         assert_eq!(format_permissions(0o100644), "-rw-r--r--");
49         assert_eq!(format_permissions(0o644), "-rw-r--r--");
50     }
51 }