Skip to main content

rust_serv/utils/
helpers.rs

1/// Convert bytes to human-readable format
2pub fn format_bytes(bytes: u64) -> String {
3    const UNITS: &[&str] = &["B", "KB", "MB", "GB", "TB"];
4    let mut size = bytes as f64;
5    let mut unit_index = 0;
6
7    while size >= 1024.0 && unit_index < UNITS.len() - 1 {
8        size /= 1024.0;
9        unit_index += 1;
10    }
11
12    format!("{:.2} {}", size, UNITS[unit_index])
13}
14
15/// Generate ETag from file content
16pub fn generate_etag(content: &[u8]) -> String {
17    use std::collections::hash_map::DefaultHasher;
18    use std::hash::{Hash, Hasher};
19
20    let mut hasher = DefaultHasher::new();
21    content.hash(&mut hasher);
22    format!("\"{:x}\"", hasher.finish())
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn test_format_bytes() {
31        assert_eq!(format_bytes(0), "0.00 B");
32        assert_eq!(format_bytes(1024), "1.00 KB");
33        assert_eq!(format_bytes(1024 * 1024), "1.00 MB");
34    }
35
36    #[test]
37    fn test_generate_etag() {
38        let etag1 = generate_etag(b"hello");
39        let etag2 = generate_etag(b"hello");
40        let etag3 = generate_etag(b"world");
41
42        assert_eq!(etag1, etag2);
43        assert_ne!(etag1, etag3);
44    }
45}