Skip to main content

warcraft_rs/utils/
format.rs

1//! Formatting utilities
2
3use chrono::{Local, TimeZone};
4use humansize::{DECIMAL, format_size};
5
6/// Format file size in human-readable format
7pub fn format_bytes(bytes: u64) -> String {
8    format_size(bytes, DECIMAL)
9}
10
11/// Format a timestamp
12#[allow(dead_code)] // Will be used when other file formats are implemented
13pub fn format_timestamp(timestamp: u64) -> String {
14    if timestamp == 0 {
15        "N/A".to_string()
16    } else {
17        // Convert timestamp to DateTime
18        match Local.timestamp_opt(timestamp as i64, 0) {
19            chrono::LocalResult::Single(datetime) => {
20                datetime.format("%Y-%m-%d %H:%M:%S").to_string()
21            }
22            _ => "Invalid timestamp".to_string(),
23        }
24    }
25}
26
27/// Format a percentage
28pub fn format_percentage(value: f64) -> String {
29    format!("{value:.1}%")
30}
31
32/// Format a compression ratio
33pub fn format_compression_ratio(original: u64, compressed: u64) -> String {
34    if original == 0 {
35        "N/A".to_string()
36    } else {
37        let ratio = 100.0 - (compressed as f64 / original as f64 * 100.0);
38        format_percentage(ratio)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_format_bytes() {
48        assert_eq!(format_bytes(0), "0 B");
49        assert_eq!(format_bytes(1024), "1.02 kB");
50        assert_eq!(format_bytes(1048576), "1.05 MB");
51        assert_eq!(format_bytes(1073741824), "1.07 GB");
52    }
53
54    #[test]
55    fn test_format_compression_ratio() {
56        assert_eq!(format_compression_ratio(1000, 500), "50.0%");
57        assert_eq!(format_compression_ratio(1000, 250), "75.0%");
58        assert_eq!(format_compression_ratio(1000, 1000), "0.0%");
59        assert_eq!(format_compression_ratio(0, 0), "N/A");
60    }
61}