Skip to main content

vdsl_sync/application/
error.rs

1//! SyncError — アプリケーション層の統合エラー。
2//!
3//! ドメインエラーとインフラエラーを `#[from]` で結合し、
4//! アプリケーション固有のバリアントを追加する。
5//!
6//! infra trait (`FileStore`, `TransferStore`, `StorageBackend`) の返り値型。
7//! 外部crate (vdsl-mcp) からもこのエラーが参照される。
8
9use crate::domain::error::DomainError;
10use crate::infra::error::InfraError;
11
12/// Sync engine の統合エラー。
13#[derive(Debug, thiserror::Error)]
14pub enum SyncError {
15    /// ドメイン不変条件違反。
16    #[error(transparent)]
17    Domain(#[from] DomainError),
18
19    /// インフラストラクチャ障害。
20    #[error(transparent)]
21    Infra(#[from] InfraError),
22
23    /// パスがsync root外。
24    #[error("path is outside sync root: {path}")]
25    OutsideSyncRoot { path: String },
26
27    /// 重複ファイル検出。
28    #[error("duplicate file: {path} is a duplicate of {duplicate_of}")]
29    Duplicate { path: String, duplicate_of: String },
30
31    /// ファイルがsync storeに未登録。
32    #[error("file not registered in sync store: {0}")]
33    NotRegistered(String),
34
35    /// 初期化失敗(拠点到達不能、外部ツール確保失敗等)。
36    #[error("initialization failed: {0}")]
37    Init(String),
38
39    /// バックエンド未設定。
40    #[error("backend not configured for location: {0}")]
41    NoBackend(String),
42
43    /// ルートなし。
44    #[error("no route available: {src} → {dest}, path={path}")]
45    NoRouteAvailable {
46        src: String,
47        dest: String,
48        path: String,
49    },
50}
51
52// ---------------------------------------------------------------------------
53// Convenience conversions: allow `?` from common infra error sources
54// ---------------------------------------------------------------------------
55
56impl From<std::io::Error> for SyncError {
57    fn from(e: std::io::Error) -> Self {
58        Self::Infra(InfraError::Io(e))
59    }
60}
61
62impl From<serde_json::Error> for SyncError {
63    fn from(e: serde_json::Error) -> Self {
64        Self::Infra(InfraError::Serialization(e.to_string()))
65    }
66}