ahrightos-fs 0.1.0

Portable filesystem, block-device, and IPC primitives for the AhRightOS teaching kernel.
Documentation
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)
    }
}