backup_suite/lib.rs
1//! # backup-suite: エンタープライズ対応Rust製バックアップツール
2//!
3//! `backup-suite`は、セキュリティ、パフォーマンス、信頼性を重視したエンタープライズレベルの
4//! バックアップソリューションです。型安全性、並列処理、包括的なエラーハンドリングにより、
5//! プロダクション環境での安全な運用を可能にします。
6
7// Clippy pedantic lints - 一部は開発効率とのトレードオフで許可
8#![allow(clippy::missing_errors_doc)] // Errorドキュメントは型シグネチャで明確
9#![allow(clippy::missing_panics_doc)] // Panicケースは意図的に制限
10#![allow(clippy::too_many_lines)] // 複雑なロジックは分割よりも凝集性を優先
11#![allow(clippy::must_use_candidate)] // 必要な箇所のみ#[must_use]を付与
12#![allow(clippy::cast_precision_loss)] // パフォーマンス統計での精度低下は許容
13#![allow(clippy::needless_pass_by_value)] // APIの一貫性と使いやすさを優先
14#![allow(clippy::similar_names)] // ドメイン用語の類似名は許容
15#![allow(clippy::module_name_repetitions)] // 明示的な命名を優先
16#![allow(clippy::trivially_copy_pass_by_ref)] // APIの一貫性を優先
17#![allow(clippy::unused_self)] // トレイト実装の一貫性を優先
18#![allow(clippy::unnecessary_wraps)] // エラーハンドリングの拡張性を確保
19#![allow(clippy::match_same_arms)] // コードの明示性と将来の拡張性を優先
20#![allow(clippy::cast_possible_truncation)] // 実行環境での妥当性は検証済み
21#![allow(clippy::cast_sign_loss)] // 圧縮レベル等の値域は保証済み
22#![allow(clippy::if_not_else)] // 自然な条件分岐の流れを優先
23#![allow(clippy::single_match_else)] // 将来のパターン追加を想定
24#![allow(clippy::items_after_statements)] // コードの可読性を優先
25#![allow(clippy::manual_let_else)] // 既存コードとの一貫性を優先
26#![allow(clippy::float_cmp)] // 統計計算での許容範囲内
27#![allow(clippy::doc_markdown)] // 技術用語のbackticksは必要に応じて
28#![allow(clippy::semicolon_if_nothing_returned)] // 明示的な制御フローを優先
29#![allow(clippy::map_unwrap_or)] // 可読性を優先
30#![allow(clippy::format_push_string)] // 局所的な最適化は不要
31#![allow(clippy::format_collect)] // 局所的な最適化は不要
32#![allow(clippy::ignored_unit_patterns)] // 明示性よりも簡潔さを優先
33#![allow(clippy::unnecessary_debug_formatting)] // デバッグ情報の統一性を優先
34#![allow(clippy::incompatible_msrv)] // MSRV 1.70互換性は別途検証
35#![allow(clippy::case_sensitive_file_extension_comparisons)] // プラットフォーム固有動作を優先
36#![allow(clippy::cast_lossless)] // 明示的な型変換で可読性を優先
37#![allow(clippy::tests_outside_test_module)] // 統合テストの柔軟性を優先
38#![allow(missing_docs)] // 公開API以外のドキュメントは段階的に充実
39//!
40//! ## 🚀 主要機能
41//!
42//! ### セキュリティファースト
43//! - **パストラバーサル対策**: [`safe_join`]によるディレクトリトラバーサル攻撃防止
44//! - **権限チェック**: ファイルアクセス前の厳密な権限確認
45//! - **入力検証**: 全ユーザー入力の検証とサニタイズ
46//! - **機密情報保護**: エラーメッセージからの機密情報漏洩防止
47//!
48//! ### 高性能・スケーラブル
49//! - **並列処理**: [`rayon`]によるマルチコアCPU活用
50//! - **I/O最適化**: [`CopyEngine`]によるバッファリング・ストリーミング
51//! - **メモリ効率**: 大容量ファイルの低メモリ処理
52//! - **プログレス表示**: リアルタイム進捗・統計情報
53//!
54//! ### エンタープライズ機能
55//! - **優先度管理**: High/Medium/Low による重要度別管理
56//! - **設定バリデーション**: 厳密な設定検証とエラー報告
57//! - **包括的ログ**: 詳細な操作履歴とエラートレース
58//! - **除外パターン**: 正規表現による柔軟なファイル除外
59//!
60//! ## 📚 使用例
61//!
62//! ### 基本的なバックアップ
63//!
64//! ```rust,no_run
65//! use backup_suite::{Config, BackupRunner, Target, Priority};
66//! use std::path::PathBuf;
67//!
68//! # fn main() -> backup_suite::Result<()> {
69//! // 1. 設定をロード(または新規作成)
70//! let mut config = Config::load().unwrap_or_default();
71//!
72//! // 2. バックアップ対象を追加
73//! let target = Target::new(
74//! PathBuf::from("/home/user/documents"),
75//! Priority::High,
76//! "重要ドキュメント".to_string()
77//! );
78//! config.add_target(target);
79//! config.save()?;
80//!
81//! // 3. バックアップ実行
82//! let mut runner = BackupRunner::new(config, false); // false = 実際に実行
83//! let result = runner.run(None, None)?; // None = 全優先度対象
84//!
85//! // 4. 結果確認
86//! if result.failed > 0 {
87//! eprintln!("警告: {}件のファイルでエラーが発生", result.failed);
88//! for error in &result.errors {
89//! eprintln!(" - {}", error);
90//! }
91//! }
92//! println!("✅ バックアップ完了: {}件成功, 合計{}",
93//! result.successful,
94//! format_bytes(result.total_bytes));
95//! # Ok(())
96//! # }
97//! # fn format_bytes(bytes: u64) -> String { format!("{}B", bytes) }
98//! ```
99//!
100//! ### 高度な設定例
101//!
102//! ```rust,no_run
103//! use backup_suite::*;
104//! use std::path::PathBuf;
105//!
106//! # fn main() -> backup_suite::Result<()> {
107//! let mut config = Config::default();
108//!
109//! // プロジェクトファイル(.gitを除外)
110//! let mut project_target = Target::new(
111//! PathBuf::from("/home/user/projects"),
112//! Priority::Medium,
113//! "プロジェクト".to_string()
114//! );
115//! project_target.exclude_patterns = vec![
116//! r"\.git/.*".to_string(),
117//! r"node_modules/.*".to_string(),
118//! r"target/.*".to_string(),
119//! ];
120//! config.add_target(project_target);
121//!
122//! // 重要ファイルのみ(高優先度)
123//! let mut runner = BackupRunner::new(config, false)
124//! .with_progress(true); // プログレスバー表示
125//!
126//! let result = runner.run(Some(&Priority::High), None)?;
127//! # Ok(())
128//! # }
129//! ```
130//!
131//! ### エラーハンドリング
132//!
133//! ```rust,no_run
134//! use backup_suite::{BackupError, Result};
135//!
136//! fn handle_backup_errors() -> Result<()> {
137//! match perform_backup() {
138//! Ok(result) => {
139//! println!("✅ 成功: {}件処理", result.total_files);
140//! Ok(())
141//! }
142//! Err(BackupError::PathTraversalDetected { path }) => {
143//! eprintln!("🚨 セキュリティ警告: 不正なパス検出 {:?}", path);
144//! // セキュリティ関連エラーは処理を中断
145//! std::process::exit(1);
146//! }
147//! Err(BackupError::PermissionDenied { path }) => {
148//! eprintln!("❌ 権限エラー: {:?} にアクセスできません", path);
149//! // 権限エラーは警告として処理継続
150//! Ok(())
151//! }
152//! Err(e) if e.is_recoverable() => {
153//! eprintln!("⚠️ 一時的エラー(リトライ推奨): {}", e);
154//! // リトライ可能なエラー
155//! Err(e)
156//! }
157//! Err(e) => {
158//! eprintln!("💥 重大エラー: {}", e.user_friendly_message());
159//! Err(e)
160//! }
161//! }
162//! }
163//! # fn perform_backup() -> backup_suite::Result<backup_suite::BackupResult> {
164//! # todo!()
165//! # }
166//! ```
167//!
168//! ## 🏗️ アーキテクチャ
169//!
170//! ### コアモジュール ([`core`])
171//! - **[`Config`]**: 設定管理・バリデーション・永続化
172//! - **[`BackupRunner`]**: バックアップ処理エンジン・並列実行
173//! - **[`Target`]**: バックアップ対象定義・除外パターン
174//! - **[`CopyEngine`]**: I/O最適化・ファイルコピー
175//! - **[`BackupHistory`]**: 履歴管理・統計情報
176//!
177//! ### セキュリティモジュール ([`security`])
178//! - **`safe_join`**: パストラバーサル対策パス結合
179//! - **`validate_path_safety`**: パス安全性検証
180//! - **`sanitize_path_component`**: パス文字列サニタイズ
181//! - **権限チェック**: Unix/Windows対応権限確認
182//!
183//! ### UIモジュール ([`ui`])
184//! - **`BackupProgress`**: プログレスバー・統計表示
185//! - **`display_dashboard`**: ダッシュボード・概要表示
186//! - **[`ColorTheme`]**: アクセシビリティ対応色彩
187//! - **テーブル表示**: 構造化データの美しい表示
188//!
189//! ### エラーハンドリング ([`error`])
190//! - **[`BackupError`]**: 型安全なエラー分類
191//! - **[`Result`]**: 統一されたResult型
192//! - **ユーザーフレンドリー**: 分かりやすいエラーメッセージ
193//!
194//! ## 🔒 セキュリティ設計
195//!
196//! ### 脅威モデル
197//! - **ディレクトリトラバーサル**: `../../../etc/passwd` 等の攻撃
198//! - **権限昇格**: 不正なファイルアクセス試行
199//! - **シンボリックリンク**: リンク経由の意図しないアクセス
200//! - **機密情報漏洩**: エラーメッセージ経由の情報漏洩
201//!
202//! ### 対策実装
203//! ```rust,no_run
204//! use backup_suite::security::{safe_join, validate_path_safety};
205//! use std::path::Path;
206//!
207//! # fn main() -> backup_suite::Result<()> {
208//! let base = Path::new("/safe/backup/dir");
209//! let user_input = Path::new("../../../etc/passwd"); // 攻撃試行
210//!
211//! // safe_joinは自動的に危険なパスを検出・拒否
212//! match safe_join(base, user_input) {
213//! Ok(safe_path) => {
214//! println!("安全なパス: {:?}", safe_path);
215//! // /safe/backup/dir/etc/passwd として正規化
216//! }
217//! Err(e) => {
218//! eprintln!("🚨 攻撃検出: {}", e);
219//! // ディレクトリトラバーサル攻撃をブロック
220//! }
221//! }
222//! # Ok(())
223//! # }
224//! ```
225//!
226//! ## ⚡ パフォーマンス特性
227//!
228//! ### ベンチマーク結果(参考値)
229//! - **小ファイル多数**: 10,000ファイル/秒
230//! - **大ファイル**: 500MB/秒(SSD環境)
231//! - **メモリ使用量**: 50MB未満(ファイル数に依存しない)
232//! - **CPU使用率**: 全コア活用(並列度調整可能)
233//!
234//! ### 最適化設定
235//! ```rust,no_run
236//! use backup_suite::{BackupRunner, Config};
237//!
238//! # fn main() -> backup_suite::Result<()> {
239//! let config = Config::load()?;
240//! let mut runner = BackupRunner::new(config, false)
241//! .with_progress(true); // プログレス表示有効
242//!
243//! // CPU集約的環境での実行
244//! std::env::set_var("RAYON_NUM_THREADS", "8");
245//! let result = runner.run(None, None)?;
246//! # Ok(())
247//! # }
248//! ```
249//!
250//! ## 📋 設定リファレンス
251//!
252//! 設定ファイル (`~/.config/backup-suite/config.toml`) の例:
253//!
254//! ```toml
255//! [backup]
256//! destination = "/path/to/backup/storage"
257//! auto_cleanup = true
258//! max_backup_age_days = 30
259//!
260//! [schedule]
261//! enabled = true
262//! high_frequency = "daily"
263//! medium_frequency = "weekly"
264//! low_frequency = "monthly"
265//!
266//! [[targets]]
267//! path = "/home/user/documents"
268//! priority = "High"
269//! category = "重要ドキュメント"
270//! exclude_patterns = ["*.tmp", "*.log"]
271//! ```
272
273// モジュール宣言
274pub mod compression;
275pub mod core;
276pub mod crypto;
277pub mod error;
278pub mod i18n;
279pub mod security;
280#[cfg(feature = "smart")]
281pub mod smart;
282pub mod typo;
283pub mod ui;
284
285// 主要な型を再エクスポート
286pub use compression::{CompressedData, CompressionConfig, CompressionEngine, CompressionType};
287pub use core::{
288 BackupHistory, BackupResult, BackupRunner, CleanupEngine, CleanupPolicy, CleanupResult, Config,
289 CopyEngine, Frequency, PerformanceConfig, PipelineConfig, Platform, Priority, ProcessedData,
290 ProcessingMetadata, ProcessingPipeline, RestoreEngine, RestoreResult, ScheduleStatus,
291 Scheduler, Target, TargetType,
292};
293// Phase 2: 履歴管理の拡張型をエクスポート
294pub use core::history::BackupStatus;
295pub use crypto::{
296 EncryptedData, EncryptionConfig, EncryptionEngine, KeyDerivation, KeyManager, MasterKey,
297};
298pub use error::{BackupError, Result};
299pub use i18n::{get_message, Language, MessageKey};
300pub use security::{
301 check_read_permission, check_write_permission, safe_join, AuditEvent, AuditLog, EventType,
302};
303pub use ui::{
304 display_backup_result, display_dashboard, display_history, display_targets, ColorScheme,
305 ColorTheme,
306};
307
308#[cfg(unix)]
309pub use security::check_execute_permission;
310
311// バージョン情報
312pub const VERSION: &str = env!("CARGO_PKG_VERSION");
313pub const PKG_NAME: &str = env!("CARGO_PKG_NAME");
314
315#[cfg(test)]
316mod tests {
317 use super::*;
318
319 #[test]
320 #[allow(clippy::const_is_empty)]
321 fn test_version_info() {
322 assert!(!VERSION.is_empty());
323 assert_eq!(PKG_NAME, "backup-suite");
324 }
325
326 #[test]
327 fn test_exports_available() {
328 // 主要な型がエクスポートされていることを確認
329 use std::hint::black_box;
330 black_box(Config::default());
331 black_box(Priority::Medium);
332 }
333
334 #[test]
335 fn test_ui_exports() {
336 // UI機能がエクスポートされていることを確認
337 use std::hint::black_box;
338 black_box(ColorTheme::auto());
339 black_box(ColorScheme::Auto);
340 }
341}