Coverage Report

Created: 2025-09-19 09:35

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/home/gh-runner/action-runner3/_work/feoxdb/feoxdb/src/error.rs
Line
Count
Source
1
use std::io;
2
use thiserror::Error;
3
4
#[derive(Error, Debug)]
5
pub 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
    #[error("TTL feature is not enabled")]
109
    TtlNotEnabled,
110
}
111
112
pub type Result<T> = std::result::Result<T, FeoxError>;
113
114
impl From<i32> for FeoxError {
115
0
    fn from(errno: i32) -> Self {
116
0
        match errno {
117
0
            2 => FeoxError::KeyNotFound,
118
0
            12 => FeoxError::OutOfMemory,
119
0
            17 => FeoxError::OlderTimestamp,
120
0
            22 => FeoxError::InvalidKeySize,
121
0
            28 => FeoxError::DatabaseFull,
122
0
            75 => FeoxError::NumericOverflow,
123
0
            90 => FeoxError::SizeMismatch {
124
0
                expected: 0,
125
0
                actual: 0,
126
0
            },
127
0
            _ => FeoxError::SystemError(errno),
128
        }
129
0
    }
130
}
131
132
impl FeoxError {
133
0
    pub fn errno(&self) -> i32 {
134
0
        match self {
135
0
            FeoxError::InvalidKeySize | FeoxError::InvalidValueSize => crate::constants::EINVAL,
136
0
            FeoxError::KeyNotFound => crate::constants::ENOENT,
137
0
            FeoxError::DatabaseFull => crate::constants::ENOSPC,
138
0
            FeoxError::OutOfMemory | FeoxError::AllocationFailed => crate::constants::ENOMEM,
139
0
            FeoxError::OlderTimestamp => crate::constants::EEXIST,
140
0
            FeoxError::NumericOverflow => crate::constants::EOVERFLOW,
141
0
            FeoxError::InvalidRange => crate::constants::EINVAL,
142
0
            FeoxError::MultiTenantDisabled => crate::constants::ENODEV,
143
0
            FeoxError::NoDevice => crate::constants::ENODEV,
144
0
            FeoxError::InvalidMetadata | FeoxError::CorruptedRecord => crate::constants::EIO,
145
0
            FeoxError::IoError(_) => crate::constants::EIO,
146
0
            FeoxError::SystemError(e) => *e,
147
0
            FeoxError::Timeout => crate::constants::EAGAIN,
148
0
            FeoxError::SizeMismatch { .. } => crate::constants::EMSGSIZE,
149
0
            _ => crate::constants::EIO,
150
        }
151
0
    }
152
}