use chrono::{DateTime, Local};
pub const UNKNOWN: &str = "—";
pub fn size(bytes: u64) -> String {
humansize::format_size(bytes, humansize::DECIMAL)
}
pub fn modified(time: Option<std::time::SystemTime>) -> String {
match time {
Some(t) => {
let dt: DateTime<Local> = t.into();
dt.format("%Y-%m-%d %H:%M").to_string()
}
None => UNKNOWN.to_owned(),
}
}
pub const MODIFIED_WIDTH: usize = 16;
pub fn modified_short(time: Option<std::time::SystemTime>) -> String {
match time {
Some(t) => {
let dt: DateTime<Local> = t.into();
dt.format("%Y-%m-%d").to_string()
}
None => UNKNOWN.to_owned(),
}
}
pub const MODIFIED_SHORT_WIDTH: usize = 10;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn size_uses_decimal_units() {
assert_eq!(size(0), "0 B");
assert_eq!(size(1000), "1 kB");
}
#[test]
fn modified_without_a_time_is_the_placeholder() {
assert_eq!(modified(None), UNKNOWN);
assert_eq!(modified_short(None), UNKNOWN);
}
#[test]
fn modified_widths_match_what_is_formatted() {
let t = std::time::SystemTime::UNIX_EPOCH + std::time::Duration::from_secs(1_700_000_000);
assert_eq!(modified(Some(t)).chars().count(), MODIFIED_WIDTH);
assert_eq!(
modified_short(Some(t)).chars().count(),
MODIFIED_SHORT_WIDTH
);
}
}