#[cfg(feature = "time")]
use chrono::{DateTime, Utc};
#[cfg(feature = "time")]
use std::time::Duration;
use std::{borrow::Cow, time::SystemTime};
use tai64::Tai64N;
pub type CowStr<'a> = Cow<'a, str>;
pub struct FsUtils;
impl FsUtils {
pub fn maybe_time(time_result: Option<SystemTime>) -> Option<Tai64N> {
time_result.map(|time| Tai64N::from_system_time(&time))
}
pub fn size_to_bytes(bytes: usize) -> String {
byte_prefix::calc_bytes(bytes as f32)
}
#[cfg(feature = "time")]
pub fn tai64_to_local_hrs<'a>(time: &Tai64N) -> DateTimeString<'a> {
let date_time: DateTime<Utc> = time.to_system_time().into();
let date = date_time
.date_naive()
.format("%A, %-d %B, %C%y")
.to_string();
let date = CowStr::Owned(date);
let time = date_time.format("%H:%M:%S").to_string();
let time = CowStr::Owned(time);
DateTimeString { date, time }
}
#[cfg(feature = "time")]
pub fn tai64_to_local_am_pm<'a>(time: &Tai64N) -> DateTimeString<'a> {
let date_time: DateTime<Utc> = time.to_system_time().into();
let date = date_time
.date_naive()
.format("%A, %-d %B, %C%y")
.to_string();
let date = CowStr::Owned(date);
let time = date_time.format("%-I:%M %p").to_string();
let time = CowStr::Owned(time);
DateTimeString { date, time }
}
#[cfg(feature = "time")]
pub fn tai64_to_humantime_with_epoch(time: &Tai64N) -> Option<String> {
FsUtils::tai64_duration_since_epoch(time)
.map(|duration| humantime::format_duration(duration).to_string())
}
#[cfg(feature = "time")]
pub fn tai64_to_humantime(earlier_time: &Tai64N, current_time: &Tai64N) -> Option<String> {
FsUtils::tai64_duration(earlier_time, current_time)
.map(|duration| humantime::format_duration(duration).to_string())
}
#[cfg(feature = "time")]
pub fn tai64_now_duration_to_humantime(earlier_time: &Tai64N) -> Option<String> {
FsUtils::tai64_duration_from_now(earlier_time)
.map(|duration| humantime::format_duration(duration).to_string())
}
#[cfg(feature = "time")]
pub fn tai64_duration(earlier_time: &Tai64N, current_time: &Tai64N) -> Option<Duration> {
match earlier_time.duration_since(current_time) {
Ok(valid_time) => Some(valid_time),
Err(_) => Option::None,
}
}
#[cfg(feature = "time")]
pub fn tai64_duration_since_epoch(time: &Tai64N) -> Option<Duration> {
match time.duration_since(&Tai64N::UNIX_EPOCH) {
Ok(valid_time) => Some(valid_time),
Err(_) => Option::None,
}
}
#[cfg(feature = "time")]
pub fn tai64_duration_from_now(earlier_time: &Tai64N) -> Option<Duration> {
match Tai64N::now().duration_since(earlier_time) {
Ok(valid_time) => Some(valid_time),
Err(_) => Option::None,
}
}
}
#[cfg(feature = "time")]
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Default)]
pub struct DateTimeString<'a> {
pub date: CowStr<'a>,
pub time: CowStr<'a>,
}