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}