1use core::fmt;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum FileError {
5 NotFound,
6 PermissionDenied,
7 EndOfFile,
8 InvalidOperation,
9 IoError,
10 AlreadyExists,
11 NotDirectory,
12 IsDirectory,
13 WouldBlock,
14}
15
16impl fmt::Display for FileError {
17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18 match self {
19 Self::NotFound => write!(f, "File not found"),
20 Self::PermissionDenied => write!(f, "Permission denied"),
21 Self::EndOfFile => write!(f, "End of file"),
22 Self::InvalidOperation => write!(f, "Invalid operation"),
23 Self::IoError => write!(f, "I/O error"),
24 Self::AlreadyExists => write!(f, "File already exists"),
25 Self::NotDirectory => write!(f, "Not a directory"),
26 Self::IsDirectory => write!(f, "Is a directory"),
27 Self::WouldBlock => write!(f, "Operation would block"),
28 }
29 }
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq)]
33pub enum SeekFrom {
34 Start(usize),
35 Current(isize),
36 End(isize),
37}
38
39#[derive(Debug, Clone, Copy, PartialEq, Eq)]
40pub enum FileType {
41 RegularFile,
42 Directory,
43 SymbolicLink,
44 CharDevice,
45 BlockDevice,
46 Pipe,
47}
48
49#[derive(Debug, Clone, PartialEq, Eq)]
50pub struct FileMetadata {
51 pub file_type: FileType,
52 pub size: usize,
53 pub mode: u32,
54 pub created: u64,
55 pub modified: u64,
56}
57
58pub trait File: Send + Sync {
59 fn read(&mut self, buf: &mut [u8]) -> Result<usize, FileError>;
60
61 fn write(&mut self, buf: &[u8]) -> Result<usize, FileError>;
62
63 fn seek(&mut self, _pos: SeekFrom) -> Result<usize, FileError> {
64 Err(FileError::InvalidOperation)
65 }
66}