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}