use time::{format_description::well_known::Rfc3339, OffsetDateTime};
pub fn now_iso() -> String {
OffsetDateTime::now_utc()
.format(&Rfc3339)
.unwrap_or_else(|_| "1970-01-01T00:00:00Z".to_string())
}
pub fn now_ms() -> i128 {
OffsetDateTime::now_utc().unix_timestamp_nanos() / 1_000_000
}
pub fn parse_ms(ts: &str) -> Option<i128> {
OffsetDateTime::parse(ts, &Rfc3339)
.ok()
.map(|t| t.unix_timestamp_nanos() / 1_000_000)
}
pub fn basename(p: &str) -> &str {
p.trim_end_matches('/').rsplit('/').next().unwrap_or(p)
}
pub fn is_group_or_other_accessible(mode: u32) -> bool {
mode & 0o077 != 0
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn basename_handles_trailing_slash_and_bare_names() {
assert_eq!(basename("/a/b/c.json"), "c.json");
assert_eq!(basename("/a/b/"), "b");
assert_eq!(basename("bare"), "bare");
assert_eq!(basename(""), "");
}
#[test]
fn group_or_other_access_matches_octal_mask() {
assert!(!is_group_or_other_accessible(0o600));
assert!(is_group_or_other_accessible(0o640)); assert!(is_group_or_other_accessible(0o604)); assert!(!is_group_or_other_accessible(0o700));
}
#[test]
fn parse_ms_round_trips_and_rejects_garbage() {
assert_eq!(parse_ms("1970-01-01T00:00:01Z"), Some(1000));
assert_eq!(parse_ms("not-a-timestamp"), None);
}
}