pub(super) fn format_size(size: u64) -> String {
const KB: f64 = 1024.0;
const MB: f64 = KB * 1024.0;
const GB: f64 = MB * 1024.0;
let s = size as f64;
if s >= GB {
format!("{:.2} GB", s / GB)
} else if s >= MB {
format!("{:.2} MB", s / MB)
} else if s >= KB {
format!("{:.0} KB", s / KB)
} else {
format!("{} B", size)
}
}
pub(super) fn format_modified_ago(modified: Option<std::time::SystemTime>) -> String {
use std::time::SystemTime;
let m = match modified {
Some(t) => t,
None => return String::new(),
};
let now = SystemTime::now();
let delta = match now.duration_since(m) {
Ok(d) => d,
Err(e) => e.duration(),
};
const DAY: u64 = 24 * 60 * 60;
const WEEK: u64 = 7 * DAY;
if delta.as_secs() >= WEEK {
use chrono::{DateTime, Local};
let dt: DateTime<Local> = DateTime::<Local>::from(m);
return dt.format("%Y-%m-%d").to_string();
}
humanize_duration(delta)
}
pub(super) fn humanize_duration(d: std::time::Duration) -> String {
let secs = d.as_secs();
const MIN: u64 = 60;
const HOUR: u64 = 60 * MIN;
const DAY: u64 = 24 * HOUR;
const WEEK: u64 = 7 * DAY;
if secs < 10 {
return "just now".into();
}
if secs < MIN {
return format!("{}s ago", secs);
}
if secs < HOUR {
return format!("{}m ago", secs / MIN);
}
if secs < DAY {
return format!("{}h ago", secs / HOUR);
}
if secs < WEEK {
return format!("{}d ago", secs / DAY);
}
let days = secs / DAY;
format!("{}d ago", days)
}