use alloc::rc::{Rc, Weak}; use core::cell::RefCell; use core::mem::size_of; use core; /// Abstract operations on a inode. pub trait INode { fn open(&mut self, flags: u32) -> Result<()>; fn close(&mut self) -> Result<()>; fn read_at(&mut self, offset: usize, buf: &mut [u8]) -> Result; fn write_at(&mut self, offset: usize, buf: &[u8]) -> Result; fn info(&mut self) -> Result; fn sync(&mut self) -> Result<()>; // fn name_file(&mut self) -> Result<()>; // fn reclaim(&mut self) -> Result<()>; // fn try_seek(&mut self, offset: u64) -> Result<()>; fn resize(&mut self, len: usize) -> Result<()>; fn create(&mut self, name: &'static str) -> Result>>; fn loopup(&mut self, path: &'static str) -> Result>>; // fn io_ctrl(&mut self, op: u32, data: &[u8]) -> Result<()>; } #[derive(Debug)] pub struct FileInfo { pub size: usize, pub mode: u32, pub type_: FileType, } #[derive(Debug, Eq, PartialEq)] pub enum FileType { File, Dir, } pub type Result = core::result::Result; /// Abstract filesystem pub trait FileSystem { type INode: INode; fn sync(&mut self) -> Result<()>; fn root_inode(&mut self) -> Rc>; fn unmount(&mut self) -> Result<()>; fn cleanup(&mut self); }