use std::fmt;
use chrono::TimeDelta;
pub const DATE_FORMAT: &str = "%a %b %e %T %Y";
pub const TIME_FORMAT: &str = "%T";
pub fn number_si_unit(num: f32) -> (f32, char) {
match num {
..=999.0 => (num, ' '),
..=999_999.0 => (num / 1_000.0, 'k'),
..=999_999_999.0 => (num / 1_000_000.0, 'M'),
_ => (num / 1_000_000_000.0, 'G'),
}
}
#[derive(Debug)]
pub struct TimeDeltaFmt(pub TimeDelta);
impl fmt::Display for TimeDeltaFmt {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let years = self.0.num_days() / 365;
if years > 0 {
return write!(f, "{years} years ago");
}
let months = self.0.num_days() / 30;
if months > 0 {
return write!(f, "{months} months ago");
}
let weeks = self.0.num_days() / 7;
if weeks > 0 {
return write!(f, "{weeks} weeks ago");
}
let days = self.0.num_days();
if days > 0 {
return write!(f, "{days} days ago");
}
let hours = self.0.num_hours();
if hours > 0 {
return write!(f, "{hours} hours ago");
}
let minutes = self.0.num_minutes();
write!(f, "{minutes} minutes ago")
}
}
pub struct BytesFmt<'a>(pub &'a [u8]);
impl fmt::UpperHex for BytesFmt<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for byte in self.0 {
f.write_fmt(format_args!("{:02X}", byte))?;
}
Ok(())
}
}
impl fmt::LowerHex for BytesFmt<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
for byte in self.0 {
f.write_fmt(format_args!("{:02x}", byte))?;
}
Ok(())
}
}