1pub mod backend;
18pub mod channel;
19pub mod config;
20pub mod handle;
21pub mod hooks;
22pub mod index;
23pub mod manager;
24pub mod storage;
25
26pub use backend::{BackendStats, LocalStorageBackend, StorageBackend};
32
33pub use channel::{ChannelFileInfo, ChannelManager, ChannelStats};
35
36pub use config::{
38 default_data_dir, default_data_dir_or_fallback, CleanupConfig, CleanupStrategy, FileConfig,
39};
40
41pub use handle::FileHandle;
43
44pub use hooks::{
47 CleanupHook, HookAction, HookCounts, HookRegistry, MetadataHook, ReadHook, StorageHook, };
55
56pub use index::{FileIndex, IndexStats, SqliteIndex};
58
59pub use manager::FileManager;
61
62pub use storage::{FileStorage, StorageStats};
64
65use thiserror::Error;
66
67#[derive(Error, Debug)]
69pub enum FileError {
70 #[error("IO error: {0}")]
71 Io(#[from] std::io::Error),
72
73 #[error("Serialization error: {0}")]
74 Serialization(#[from] serde_json::Error),
75
76 #[error("File not found: {0}")]
77 NotFound(String),
78
79 #[error("Invalid handle: {0}")]
80 InvalidHandle(String),
81
82 #[error("Storage error: {0}")]
83 Storage(String),
84
85 #[error("File too large: {0} bytes (max: {1} bytes)")]
86 TooLarge(u64, u64),
87
88 #[error("Hash mismatch: expected {0}, got {1}")]
89 HashMismatch(String, String),
90
91 #[error("Database error: {0}")]
92 Database(String),
93}
94
95pub type Result<T> = std::result::Result<T, FileError>;
96
97impl From<sqlx::Error> for FileError {
98 fn from(err: sqlx::Error) -> Self {
99 match err {
100 sqlx::Error::RowNotFound => {
101 FileError::NotFound("Record not found in database".to_string())
102 }
103 _ => FileError::Database(err.to_string()),
104 }
105 }
106}
107
108impl From<chrono::ParseError> for FileError {
109 fn from(err: chrono::ParseError) -> Self {
110 FileError::Storage(format!("Date parsing error: {}", err))
111 }
112}