use std::{io, time::SystemTime, fmt::Display};
#[derive(Debug)]
pub struct EzFile {
path: String,
handle: std::fs::File,
metadata: std::fs::Metadata,
}
impl EzFile {
pub fn open(path: &str) -> io::Result<Self> {
let handle = std::fs::File::open(path)?;
let metadata = handle.metadata()?;
Ok(Self {
path: path.to_string(),
handle,
metadata,
})
}
pub fn create(path: &str) -> io::Result<Self> {
let handle = std::fs::File::create(path)?;
let metadata = handle.metadata()?;
Ok(Self {
path: path.to_string(),
handle,
metadata,
})
}
#[must_use] pub fn into_raw(self) -> (String, std::fs::File, std::fs::Metadata) {
(self.path, self.handle, self.metadata)
}
pub fn accessed(&self) -> io::Result<SystemTime> {
self.metadata.accessed()
}
pub fn created(&self) -> io::Result<SystemTime> {
self.metadata.created()
}
pub fn modified(&self) -> io::Result<SystemTime> {
self.metadata.modified()
}
#[must_use] pub fn permissions(&self) -> std::fs::Permissions {
self.metadata.permissions()
}
#[must_use] pub fn path(&self) -> &str {
self.path.as_ref()
}
pub fn to_write(&mut self) -> io::Result<()> {
self.handle = std::fs::File::create(&self.path)?;
Ok(())
}
pub fn to_read(&mut self) -> io::Result<()> {
self.handle = std::fs::File::open(&self.path)?;
Ok(())
}
}
impl io::Read for EzFile {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.handle.read(buf)
}
}
impl io::Write for EzFile {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.handle.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.handle.flush()
}
}
impl Display for EzFile {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.path())
}
}