warcraft_rs/utils/
format.rs1use chrono::{Local, TimeZone};
4use humansize::{DECIMAL, format_size};
5
6pub fn format_bytes(bytes: u64) -> String {
8 format_size(bytes, DECIMAL)
9}
10
11#[allow(dead_code)] pub fn format_timestamp(timestamp: u64) -> String {
14 if timestamp == 0 {
15 "N/A".to_string()
16 } else {
17 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
27pub fn format_percentage(value: f64) -> String {
29 format!("{value:.1}%")
30}
31
32pub 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}