Skip to main content

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 not newer 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(
52        "Ambiguous v1/v2 deletion marker; reopen with allow_ambiguous_legacy_recovery(true) only for trusted migration"
53    )]
54    AmbiguousLegacyTombstone,
55
56    #[error("Invalid record")]
57    InvalidRecord,
58
59    #[error("Extent no longer belongs to this record")]
60    StaleExtent,
61
62    #[error("Invalid device")]
63    InvalidDevice,
64
65    #[error("Invalid operation")]
66    InvalidOperation,
67
68    #[error("IO error: {0}")]
69    IoError(#[from] io::Error),
70
71    #[error("Indeterminate write: {0}")]
72    IndeterminateWrite(io::Error),
73
74    #[error("System error: {0}")]
75    SystemError(i32),
76
77    #[error("JSON patch error: {0}")]
78    JsonPatchError(String),
79
80    #[error("Allocation failed")]
81    AllocationFailed,
82
83    #[error("Lock poisoned")]
84    LockPoisoned,
85
86    #[error("Channel closed")]
87    ChannelClosed,
88
89    #[error("Channel error")]
90    ChannelError,
91
92    #[error("System shutting down")]
93    ShuttingDown,
94
95    #[error("Operation timed out")]
96    Timeout,
97
98    #[error("Not implemented")]
99    NotImplemented,
100
101    #[error("Unsupported on this platform")]
102    Unsupported,
103
104    #[error("Size mismatch: expected {expected} bytes, got {actual} bytes")]
105    SizeMismatch { expected: usize, actual: usize },
106
107    #[error("Invalid argument")]
108    InvalidArgument,
109
110    #[error("Out of space")]
111    OutOfSpace,
112
113    #[error("Corrupted data")]
114    CorruptedData,
115
116    #[error("Duplicate key")]
117    DuplicateKey,
118
119    #[error("TTL feature is not enabled")]
120    TtlNotEnabled,
121}
122
123pub type Result<T> = std::result::Result<T, FeoxError>;
124
125impl From<i32> for FeoxError {
126    fn from(errno: i32) -> Self {
127        match errno {
128            2 => FeoxError::KeyNotFound,
129            12 => FeoxError::OutOfMemory,
130            17 => FeoxError::OlderTimestamp,
131            22 => FeoxError::InvalidKeySize,
132            28 => FeoxError::DatabaseFull,
133            75 => FeoxError::NumericOverflow,
134            90 => FeoxError::SizeMismatch {
135                expected: 0,
136                actual: 0,
137            },
138            _ => FeoxError::SystemError(errno),
139        }
140    }
141}
142
143impl FeoxError {
144    pub fn errno(&self) -> i32 {
145        match self {
146            FeoxError::InvalidKeySize | FeoxError::InvalidValueSize => crate::constants::EINVAL,
147            FeoxError::KeyNotFound => crate::constants::ENOENT,
148            FeoxError::DatabaseFull => crate::constants::ENOSPC,
149            FeoxError::OutOfMemory | FeoxError::AllocationFailed => crate::constants::ENOMEM,
150            FeoxError::OlderTimestamp => crate::constants::EEXIST,
151            FeoxError::NumericOverflow => crate::constants::EOVERFLOW,
152            FeoxError::InvalidRange => crate::constants::EINVAL,
153            FeoxError::MultiTenantDisabled => crate::constants::ENODEV,
154            FeoxError::NoDevice => crate::constants::ENODEV,
155            FeoxError::InvalidMetadata
156            | FeoxError::CorruptedRecord
157            | FeoxError::AmbiguousLegacyTombstone => crate::constants::EIO,
158            FeoxError::IoError(_) | FeoxError::IndeterminateWrite(_) => crate::constants::EIO,
159            FeoxError::SystemError(e) => *e,
160            FeoxError::Timeout | FeoxError::StaleExtent => crate::constants::EAGAIN,
161            FeoxError::SizeMismatch { .. } => crate::constants::EMSGSIZE,
162            _ => crate::constants::EIO,
163        }
164    }
165}