use std::{ ops::Deref, path::{Path, PathBuf}, }; use thiserror::Error; use uuid::Uuid; mod file; mod fileinfo; mod thumbnail; pub mod utils; pub use file::File; pub use fileinfo::FileInfo; pub use thumbnail::Thumbnail; #[derive(Debug, Error)] pub enum WriteFileError { #[error("root file path does not exist")] RootNotFound, #[error("permission denied")] PermissionDenied, #[error("JSON error")] JSONError(#[from] serde_json::error::Error), #[error("IO error")] IOError(#[from] std::io::Error), } #[derive(Debug, Error)] pub enum ReadFileError { #[error("file not found")] FileNotFound, #[error("path is not a file")] NotAFile, #[error("permission denied")] PermissionDenied, #[error("JSON error")] JSONError(#[from] serde_json::error::Error), #[error("IO error")] IOError(#[from] std::io::Error), } #[derive(Clone, Debug)] pub struct PathResolver(pub PathBuf); impl PathResolver { fn file_path(&self) -> PathBuf { self.0.clone() } fn metadata_path(&self) -> PathBuf { let mut path = self.0.clone(); path.set_extension("json"); path } fn thumbnail_path(&self) -> PathBuf { let mut path = self.0.clone(); path.set_extension("tn"); path } } #[derive(Clone, Debug)] pub struct FileId(String); impl From for FileId { fn from(s: String) -> Self { Self(s) } } impl From<&str> for FileId { fn from(s: &str) -> Self { Self(s.to_owned()) } } impl Deref for FileId { type Target = String; fn deref(&self) -> &Self::Target { &self.0 } } pub trait FileRoot { fn root(&self) -> PathBuf; } pub struct Context(PathBuf); impl FileRoot for Context { fn root(&self) -> PathBuf { self.0.clone() } } pub struct App { files_root: PathBuf, } impl App { pub fn new(files_root: &Path) -> App { App { files_root: PathBuf::from(files_root), } } pub fn list_files(&self) -> Vec> { unimplemented!() } pub fn add_file(&mut self, filename: String, content: Vec) -> Result { let context = Context(self.files_root.clone()); let mut file = File::new(filename, context)?; file.set_content(content)?; Ok(file) } /* pub fn delete_file(&mut self, id: String) -> Result<(), FileError> { let f = File::open(&id, &self.files_root)?; f.delete() } pub fn get_metadata(&self, id: String) -> Result { FileInfo::open(&id, &self.files_root) } */ pub fn get_file(&self, id: &str) -> Result<(FileInfo, std::fs::File), ReadFileError> { /* let f = File::open(&id, &self.files_root)?; let info = f.info(); let stream = f.stream()?; Ok((info, stream)) */ unimplemented!() } pub fn get_thumbnail(&self, id: &str) -> Result<(FileInfo, std::fs::File), ReadFileError> { /* let f = File::open(id, &self.files_root)?; let stream = f.thumbnail().stream()?; Ok((f.info(), stream)) */ unimplemented!() } }