pub(super) fn format_size(bytes: u64) -> String {
const KB: u64 = 1024;
const MB: u64 = 1024 * 1024;
const GB: u64 = 1024 * 1024 * 1024;
if bytes >= GB {
format!("{:.1} GiB", bytes as f64 / GB as f64)
} else if bytes >= MB {
format!("{:.1} MiB", bytes as f64 / MB as f64)
} else if bytes >= KB {
format!("{:.1} KiB", bytes as f64 / KB as f64)
} else {
format!("{} B", bytes)
}
}
pub(super) fn format_unix_timestamp(secs: u64) -> String {
let days_since_epoch = secs / 86400;
let time_of_day = secs % 86400;
let hours = time_of_day / 3600;
let minutes = (time_of_day % 3600) / 60;
let mut y: i64 = 1970;
let mut remaining = days_since_epoch as i64;
loop {
let days_in_year = if is_leap(y) { 366 } else { 365 };
if remaining < days_in_year {
break;
}
remaining -= days_in_year;
y += 1;
}
let month_days = if is_leap(y) {
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
} else {
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
};
let mut m = 0usize;
for (i, &d) in month_days.iter().enumerate() {
if remaining < d {
m = i;
break;
}
remaining -= d;
}
let day = remaining + 1;
format!(
"{:04}-{:02}-{:02} {:02}:{:02}",
y,
m + 1,
day,
hours,
minutes
)
}
fn is_leap(y: i64) -> bool {
(y % 4 == 0 && y % 100 != 0) || y % 400 == 0
}