use std::time::SystemTime;
use bytes::BytesMut;
use crate::since_epoch;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Timestamps {
pub accessed: SystemTime,
pub modified: SystemTime,
pub created: SystemTime,
}
impl Default for Timestamps {
fn default() -> Self {
Self {
accessed: SystemTime::UNIX_EPOCH,
modified: SystemTime::UNIX_EPOCH,
created: SystemTime::UNIX_EPOCH,
}
}
}
impl Timestamps {
pub fn from_metadata(metadata: &std::fs::Metadata) -> Result<Timestamps, std::io::Error> {
let accessed = metadata.accessed()?;
let modified = metadata.modified()?;
let created = metadata.created()?;
Ok(Timestamps {
accessed,
modified,
created,
})
}
pub(crate) fn write_to(&self, buf: &mut BytesMut) -> Result<(), std::io::Error> {
let accessed = since_epoch(self.accessed)?;
let modified = since_epoch(self.modified)?;
let created = since_epoch(self.created)?;
buf.extend(accessed.as_secs().to_le_bytes());
buf.extend(modified.as_secs().to_le_bytes());
buf.extend(created.as_secs().to_le_bytes());
Ok(())
}
}
impl From<Timestamps> for crate::Timestamps {
fn from(value: Timestamps) -> Self {
let accessed = since_epoch(value.accessed).unwrap();
let modified = since_epoch(value.modified).unwrap();
let created = since_epoch(value.created).unwrap();
crate::Timestamps {
accessed: accessed.as_nanos() as u64,
modified: modified.as_nanos() as u64,
created: created.as_nanos() as u64,
}
}
}