use async_trait::async_trait;
#[derive(Debug, thiserror::Error)]
pub enum StorageError {
#[error("File not found: {0}")]
FileNotFound(String),
#[error("Directory not found: {0}")]
DirectoryNotFound(String),
#[error("IO error: {0}")]
IoError(String),
#[error("Serialization error: {0}")]
SerializationError(String),
#[error("Network error: {0}")]
NetworkError(String),
#[error("Permission denied: {0}")]
PermissionDenied(String),
#[error("Storage backend error: {0}")]
BackendError(String),
}
#[async_trait(?Send)]
pub trait StorageBackend: Send + Sync {
async fn read_file(&self, path: &str) -> Result<Vec<u8>, StorageError>;
async fn write_file(&self, path: &str, content: &[u8]) -> Result<(), StorageError>;
async fn list_files(&self, dir: &str) -> Result<Vec<String>, StorageError>;
async fn file_exists(&self, path: &str) -> Result<bool, StorageError>;
async fn delete_file(&self, path: &str) -> Result<(), StorageError>;
async fn create_dir(&self, path: &str) -> Result<(), StorageError>;
async fn dir_exists(&self, path: &str) -> Result<bool, StorageError>;
}
#[cfg(feature = "native-fs")]
pub mod filesystem;
#[cfg(feature = "api-backend")]
pub mod api;
#[cfg(all(target_arch = "wasm32", feature = "wasm"))]
pub mod browser;