pub mod backend;
pub mod channel;
pub mod config;
pub mod handle;
pub mod hooks;
pub mod index;
pub mod manager;
pub mod storage;
pub use backend::{BackendStats, LocalStorageBackend, StorageBackend};
pub use channel::{ChannelFileInfo, ChannelManager, ChannelStats};
pub use config::{
default_data_dir, default_data_dir_or_fallback, CleanupConfig, CleanupStrategy, FileConfig,
};
pub use handle::FileHandle;
pub use hooks::{
CleanupHook, HookAction, HookCounts, HookRegistry, MetadataHook, ReadHook, StorageHook, };
pub use index::{FileIndex, IndexStats, SqliteIndex};
pub use manager::FileManager;
pub use storage::{FileStorage, StorageStats};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum FileError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("File not found: {0}")]
NotFound(String),
#[error("Invalid handle: {0}")]
InvalidHandle(String),
#[error("Storage error: {0}")]
Storage(String),
#[error("File too large: {0} bytes (max: {1} bytes)")]
TooLarge(u64, u64),
#[error("Hash mismatch: expected {0}, got {1}")]
HashMismatch(String, String),
#[error("Database error: {0}")]
Database(String),
}
pub type Result<T> = std::result::Result<T, FileError>;
impl From<sqlx::Error> for FileError {
fn from(err: sqlx::Error) -> Self {
match err {
sqlx::Error::RowNotFound => {
FileError::NotFound("Record not found in database".to_string())
}
_ => FileError::Database(err.to_string()),
}
}
}
impl From<chrono::ParseError> for FileError {
fn from(err: chrono::ParseError) -> Self {
FileError::Storage(format!("Date parsing error: {}", err))
}
}