feoxdb/
error.rs

1use std::io;
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum FeoxError {
6    #[error(
7        "Invalid key size: key must be 1-{} bytes",
8        crate::constants::MAX_KEY_SIZE
9    )]
10    InvalidKeySize,
11
12    #[error(
13        "Invalid value size: value must be 1-{} bytes",
14        crate::constants::MAX_VALUE_SIZE
15    )]
16    InvalidValueSize,
17
18    #[error("Key not found")]
19    KeyNotFound,
20
21    #[error("Database is full")]
22    DatabaseFull,
23
24    #[error("Out of memory")]
25    OutOfMemory,
26
27    #[error("Timestamp is older than existing record")]
28    OlderTimestamp,
29
30    #[error("Invalid numeric value")]
31    InvalidNumericValue,
32
33    #[error("Numeric overflow")]
34    NumericOverflow,
35
36    #[error("Invalid range: start key must be <= end key")]
37    InvalidRange,
38
39    #[error("Multi-tenant mode is disabled")]
40    MultiTenantDisabled,
41
42    #[error("No device configured")]
43    NoDevice,
44
45    #[error("Invalid metadata")]
46    InvalidMetadata,
47
48    #[error("Corrupted record")]
49    CorruptedRecord,
50
51    #[error("Invalid record")]
52    InvalidRecord,
53
54    #[error("Invalid device")]
55    InvalidDevice,
56
57    #[error("Invalid operation")]
58    InvalidOperation,
59
60    #[error("IO error: {0}")]
61    IoError(#[from] io::Error),
62
63    #[error("System error: {0}")]
64    SystemError(i32),
65
66    #[error("JSON patch error: {0}")]
67    JsonPatchError(String),
68
69    #[error("Allocation failed")]
70    AllocationFailed,
71
72    #[error("Lock poisoned")]
73    LockPoisoned,
74
75    #[error("Channel closed")]
76    ChannelClosed,
77
78    #[error("Channel error")]
79    ChannelError,
80
81    #[error("System shutting down")]
82    ShuttingDown,
83
84    #[error("Operation timed out")]
85    Timeout,
86
87    #[error("Not implemented")]
88    NotImplemented,
89
90    #[error("Unsupported on this platform")]
91    Unsupported,
92
93    #[error("Size mismatch: expected {expected} bytes, got {actual} bytes")]
94    SizeMismatch { expected: usize, actual: usize },
95
96    #[error("Invalid argument")]
97    InvalidArgument,
98
99    #[error("Out of space")]
100    OutOfSpace,
101
102    #[error("Corrupted data")]
103    CorruptedData,
104
105    #[error("Duplicate key")]
106    DuplicateKey,
107}
108
109pub type Result<T> = std::result::Result<T, FeoxError>;
110
111impl From<i32> for FeoxError {
112    fn from(errno: i32) -> Self {
113        match errno {
114            2 => FeoxError::KeyNotFound,
115            12 => FeoxError::OutOfMemory,
116            17 => FeoxError::OlderTimestamp,
117            22 => FeoxError::InvalidKeySize,
118            28 => FeoxError::DatabaseFull,
119            75 => FeoxError::NumericOverflow,
120            90 => FeoxError::SizeMismatch {
121                expected: 0,
122                actual: 0,
123            },
124            _ => FeoxError::SystemError(errno),
125        }
126    }
127}
128
129impl FeoxError {
130    pub fn errno(&self) -> i32 {
131        match self {
132            FeoxError::InvalidKeySize | FeoxError::InvalidValueSize => crate::constants::EINVAL,
133            FeoxError::KeyNotFound => crate::constants::ENOENT,
134            FeoxError::DatabaseFull => crate::constants::ENOSPC,
135            FeoxError::OutOfMemory | FeoxError::AllocationFailed => crate::constants::ENOMEM,
136            FeoxError::OlderTimestamp => crate::constants::EEXIST,
137            FeoxError::NumericOverflow => crate::constants::EOVERFLOW,
138            FeoxError::InvalidRange => crate::constants::EINVAL,
139            FeoxError::MultiTenantDisabled => crate::constants::ENODEV,
140            FeoxError::NoDevice => crate::constants::ENODEV,
141            FeoxError::InvalidMetadata | FeoxError::CorruptedRecord => crate::constants::EIO,
142            FeoxError::IoError(_) => crate::constants::EIO,
143            FeoxError::SystemError(e) => *e,
144            FeoxError::Timeout => crate::constants::EAGAIN,
145            FeoxError::SizeMismatch { .. } => crate::constants::EMSGSIZE,
146            _ => crate::constants::EIO,
147        }
148    }
149}