Skip to main content

agent_diva_files/
lib.rs

1//! File management system for Agent Diva
2//!
3//! Provides content-addressed storage with deduplication and reference counting.
4//! Files are stored by their SHA256 hash, enabling automatic deduplication.
5//! Reference counting ensures files are only deleted when no longer referenced.
6//!
7//! ## 模块组织
8//!
9//! - [`backend`] - 存储后端 trait 和本地实现
10//! - [`config`] - 配置管理
11//! - [`handle`] - FileHandle 和元数据类型
12//! - [`hooks`] - 生命周期钩子系统(压缩、加密、权限检查等)
13//! - [`index`] - SQLite 索引实现
14//! - [`manager`] - FileManager 主接口
15//! - [`storage`] - 文件存储和 SHA256 计算
16
17pub mod backend;
18pub mod channel;
19pub mod config;
20pub mod handle;
21pub mod hooks;
22pub mod index;
23pub mod manager;
24pub mod storage;
25
26// ---------------------------------------------------------------------------
27// 公开导出 - Public Exports
28// ---------------------------------------------------------------------------
29
30/// 存储后端 trait 和实现
31pub use backend::{BackendStats, LocalStorageBackend, StorageBackend};
32
33/// 通道(Channel)文件管理
34pub use channel::{ChannelFileInfo, ChannelManager, ChannelStats};
35
36/// 文件管理配置
37pub use config::{
38    default_data_dir, default_data_dir_or_fallback, CleanupConfig, CleanupStrategy, FileConfig,
39};
40
41/// 文件句柄(用于引用存储的文件)
42pub use handle::FileHandle;
43
44/// 钩子系统的公共类型
45// 导出 HookAction、HookRegistry 和所有 Hook trait
46pub use hooks::{
47    CleanupHook,  // 清理钩子 trait
48    HookAction,   // 钩子返回值类型
49    HookCounts,   // 钩子统计
50    HookRegistry, // 钩子注册器
51    MetadataHook, // 元数据钩子 trait
52    ReadHook,     // 读取钩子 trait
53    StorageHook,  // 存储钩子 trait
54};
55
56/// SQLite 索引实现
57pub use index::{FileIndex, IndexStats, SqliteIndex};
58
59/// FileManager 主接口
60pub use manager::FileManager;
61
62/// 文件存储统计
63pub use storage::{FileStorage, StorageStats};
64
65use thiserror::Error;
66
67/// Errors that can occur in the file management system
68#[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}