use super::entry::FileEntry;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum FilesystemError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Not a directory: {0}")]
NotADirectory(String),
#[error("Entry not found: {0}")]
NotFound(String),
#[error("Parse error: {0}")]
Parse(String),
#[error("Unsupported filesystem")]
Unsupported,
#[error("Invalid data: {0}")]
InvalidData(String),
}
pub trait Filesystem: Send {
fn root(&mut self) -> Result<FileEntry, FilesystemError>;
fn list_directory(&mut self, entry: &FileEntry) -> Result<Vec<FileEntry>, FilesystemError>;
fn read_file(&mut self, entry: &FileEntry) -> Result<Vec<u8>, FilesystemError>;
fn read_file_range(
&mut self,
entry: &FileEntry,
offset: u64,
length: usize,
) -> Result<Vec<u8>, FilesystemError>;
fn read_resource_fork(&mut self, entry: &FileEntry)
-> Result<Option<Vec<u8>>, FilesystemError>;
fn read_resource_fork_range(
&mut self,
entry: &FileEntry,
offset: u64,
length: usize,
) -> Result<Option<Vec<u8>>, FilesystemError>;
fn volume_name(&self) -> Option<&str>;
}