use core::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FileError {
NotFound,
PermissionDenied,
EndOfFile,
InvalidOperation,
IoError,
AlreadyExists,
NotDirectory,
IsDirectory,
WouldBlock,
}
impl fmt::Display for FileError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NotFound => write!(f, "File not found"),
Self::PermissionDenied => write!(f, "Permission denied"),
Self::EndOfFile => write!(f, "End of file"),
Self::InvalidOperation => write!(f, "Invalid operation"),
Self::IoError => write!(f, "I/O error"),
Self::AlreadyExists => write!(f, "File already exists"),
Self::NotDirectory => write!(f, "Not a directory"),
Self::IsDirectory => write!(f, "Is a directory"),
Self::WouldBlock => write!(f, "Operation would block"),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SeekFrom {
Start(usize),
Current(isize),
End(isize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FileType {
RegularFile,
Directory,
SymbolicLink,
CharDevice,
BlockDevice,
Pipe,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct FileMetadata {
pub file_type: FileType,
pub size: usize,
pub mode: u32,
pub created: u64,
pub modified: u64,
}
pub trait File: Send + Sync {
fn read(&mut self, buf: &mut [u8]) -> Result<usize, FileError>;
fn write(&mut self, buf: &[u8]) -> Result<usize, FileError>;
fn seek(&mut self, _pos: SeekFrom) -> Result<usize, FileError> {
Err(FileError::InvalidOperation)
}
}