Skip to main content

kawa_storage/
error.rs

1//! # Storage Error Types
2//!
3//! ストレージエンジンのエラー型定義。
4//! 詳細なエラー情報とコンテキストを提供する。
5
6use thiserror::Error;
7use std::io;
8use uuid::Uuid;
9
10/// ストレージエンジンのエラー型
11/// 
12/// # エラーカテゴリ
13/// - I/Oエラー: ファイルシステム関連
14/// - データ整合性エラー: CRCチェック、フォーマット不正
15/// - 設定エラー: 無効な設定値
16/// - 容量エラー: ディスク容量不足
17/// 
18/// # @todo
19/// - [ ] エラーメトリクスの追加
20/// - [ ] リトライ可能エラーの分類
21/// - [ ] 詳細なエラーコード体系
22#[derive(Error, Debug)]
23pub enum StorageError {
24    /// I/Oエラー
25    #[error("I/O error: {0}")]
26    Io(#[from] io::Error),
27    
28    /// データ整合性エラー - CRCチェック失敗
29    #[error("Data integrity error: CRC mismatch at offset {offset}, expected {expected:x}, got {actual:x}")]
30    CrcMismatch {
31        offset: u64,
32        expected: u32,
33        actual: u32,
34    },
35    
36    /// データフォーマットエラー
37    #[error("Invalid data format: {message}")]
38    InvalidFormat { message: String },
39    
40    /// セグメントが見つからない
41    #[error("Segment not found: {segment_id}")]
42    SegmentNotFound { segment_id: Uuid },
43    
44    /// オフセット範囲外エラー
45    #[error("Offset out of range: {offset} is beyond available data")]
46    OffsetOutOfRange { offset: u64 },
47    
48    /// 設定エラー
49    #[error("Configuration error: {message}")]
50    Configuration { message: String },
51    
52    /// ディスク容量不足
53    #[error("Insufficient disk space: need {required} bytes, available {available} bytes")]
54    InsufficientSpace {
55        required: u64,
56        available: u64,
57    },
58    
59    /// 同期エラー
60    #[error("Synchronization error: {message}")]
61    Synchronization { message: String },
62    
63    /// シリアライゼーションエラー
64    #[error("Serialization error: {0}")]
65    Serialization(#[from] bincode::Error),
66    
67    /// 内部エラー(予期しないエラー)
68    #[error("Internal error: {message}")]
69    Internal { message: String },
70}
71
72impl StorageError {
73    /// 設定エラーを作成
74    pub fn configuration(message: impl Into<String>) -> Self {
75        Self::Configuration {
76            message: message.into(),
77        }
78    }
79    
80    /// データフォーマットエラーを作成
81    pub fn invalid_format(message: impl Into<String>) -> Self {
82        Self::InvalidFormat {
83            message: message.into(),
84        }
85    }
86    
87    /// 内部エラーを作成
88    pub fn internal(message: impl Into<String>) -> Self {
89        Self::Internal {
90            message: message.into(),
91        }
92    }
93    
94    /// 同期エラーを作成
95    pub fn synchronization(message: impl Into<String>) -> Self {
96        Self::Synchronization {
97            message: message.into(),
98        }
99    }
100    
101    /// このエラーがリトライ可能かどうかを判定
102    /// 
103    /// # Returns
104    /// * `true` - リトライ可能なエラー
105    /// * `false` - リトライ不可能なエラー
106    /// 
107    /// # @todo
108    /// - [ ] より詳細なリトライ判定ロジック
109    pub fn is_retryable(&self) -> bool {
110        match self {
111            Self::Io(_) => true,
112            Self::InsufficientSpace { .. } => false,
113            Self::CrcMismatch { .. } => false,
114            Self::InvalidFormat { .. } => false,
115            Self::SegmentNotFound { .. } => false,
116            Self::OffsetOutOfRange { .. } => false,
117            Self::Configuration { .. } => false,
118            Self::Synchronization { .. } => true,
119            Self::Serialization(_) => false,
120            Self::Internal { .. } => false,
121        }
122    }
123    
124    /// エラーの重要度を取得
125    /// 
126    /// # Returns
127    /// - `High`: 即座に対処が必要
128    /// - `Medium`: 監視が必要
129    /// - `Low`: 通常のエラー
130    pub fn severity(&self) -> ErrorSeverity {
131        match self {
132            Self::CrcMismatch { .. } => ErrorSeverity::High,
133            Self::InsufficientSpace { .. } => ErrorSeverity::High,
134            Self::Internal { .. } => ErrorSeverity::High,
135            Self::InvalidFormat { .. } => ErrorSeverity::Medium,
136            Self::SegmentNotFound { .. } => ErrorSeverity::Medium,
137            Self::Configuration { .. } => ErrorSeverity::Medium,
138            Self::Io(_) => ErrorSeverity::Low,
139            Self::OffsetOutOfRange { .. } => ErrorSeverity::Low,
140            Self::Synchronization { .. } => ErrorSeverity::Low,
141            Self::Serialization(_) => ErrorSeverity::Low,
142        }
143    }
144}
145
146/// エラーの重要度
147#[derive(Debug, Clone, Copy, PartialEq, Eq)]
148pub enum ErrorSeverity {
149    /// 高: 即座に対処が必要
150    High,
151    /// 中: 監視が必要
152    Medium,
153    /// 低: 通常のエラー
154    Low,
155}
156
157/// エラー結果型の型エイリアス
158pub type StorageResult<T> = Result<T, StorageError>;