Skip to main content

agentic_logger/
error_codes.rs

1//! Standard error-code taxonomy (contract §6).
2//!
3//! Identical values to Python `agentic_logger.error_codes.ErrorCode`.
4
5/// UPPER_SNAKE error codes. Implements `Display` so it serializes as the
6/// raw string value (no quoting wrapper).
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum ErrorCode {
9    // PARSE_*
10    ParseJson,
11    ParseYaml,
12    ParseXml,
13    ParseCsv,
14    ParseRegex,
15    ParseEncoding,
16    // IO_*
17    IoNotFound,
18    IoPermission,
19    IoDiskFull,
20    IoReadFail,
21    IoWriteFail,
22    IoLockFail,
23    // EXEC_*
24    ExecNonZero,
25    ExecTimeout,
26    ExecNotFound,
27    ExecKilled,
28    ExecCrash,
29    // NET_*
30    NetTimeout,
31    NetDnsFail,
32    NetConnRefused,
33    NetSslError,
34    NetHttpError,
35    // AUTH_*
36    AuthLoginFail,
37    AuthTokenExpired,
38    AuthForbidden,
39    AuthUnauthorized,
40    // CONFIG_*
41    ConfigMissing,
42    ConfigInvalid,
43    ConfigRange,
44    // RES_*
45    ResMemory,
46    ResDisk,
47    ResCpu,
48    ResFd,
49    // TIMEOUT_*
50    TimeoutApi,
51    TimeoutDb,
52    TimeoutLock,
53    // CONFLICT_*
54    ConflictVersion,
55    ConflictLock,
56    ConflictDuplicate,
57    // INTERNAL_*
58    InternalUnexpected,
59    InternalAssert,
60    InternalType,
61    InternalKey,
62    InternalIndex,
63    // fallback
64    Unknown,
65}
66
67impl ErrorCode {
68    /// The canonical string value, e.g. `EXEC_NON_ZERO`.
69    pub const fn as_str(self) -> &'static str {
70        use ErrorCode::*;
71        match self {
72            ParseJson => "PARSE_JSON",
73            ParseYaml => "PARSE_YAML",
74            ParseXml => "PARSE_XML",
75            ParseCsv => "PARSE_CSV",
76            ParseRegex => "PARSE_REGEX",
77            ParseEncoding => "PARSE_ENCODING",
78            IoNotFound => "IO_NOT_FOUND",
79            IoPermission => "IO_PERMISSION",
80            IoDiskFull => "IO_DISK_FULL",
81            IoReadFail => "IO_READ_FAIL",
82            IoWriteFail => "IO_WRITE_FAIL",
83            IoLockFail => "IO_LOCK_FAIL",
84            ExecNonZero => "EXEC_NON_ZERO",
85            ExecTimeout => "EXEC_TIMEOUT",
86            ExecNotFound => "EXEC_NOT_FOUND",
87            ExecKilled => "EXEC_KILLED",
88            ExecCrash => "EXEC_CRASH",
89            NetTimeout => "NET_TIMEOUT",
90            NetDnsFail => "NET_DNS_FAIL",
91            NetConnRefused => "NET_CONN_REFUSED",
92            NetSslError => "NET_SSL_ERROR",
93            NetHttpError => "NET_HTTP_ERROR",
94            AuthLoginFail => "AUTH_LOGIN_FAIL",
95            AuthTokenExpired => "AUTH_TOKEN_EXPIRED",
96            AuthForbidden => "AUTH_FORBIDDEN",
97            AuthUnauthorized => "AUTH_UNAUTHORIZED",
98            ConfigMissing => "CONFIG_MISSING",
99            ConfigInvalid => "CONFIG_INVALID",
100            ConfigRange => "CONFIG_RANGE",
101            ResMemory => "RES_MEMORY",
102            ResDisk => "RES_DISK",
103            ResCpu => "RES_CPU",
104            ResFd => "RES_FD",
105            TimeoutApi => "TIMEOUT_API",
106            TimeoutDb => "TIMEOUT_DB",
107            TimeoutLock => "TIMEOUT_LOCK",
108            ConflictVersion => "CONFLICT_VERSION",
109            ConflictLock => "CONFLICT_LOCK",
110            ConflictDuplicate => "CONFLICT_DUPLICATE",
111            InternalUnexpected => "INTERNAL_UNEXPECTED",
112            InternalAssert => "INTERNAL_ASSERT",
113            InternalType => "INTERNAL_TYPE",
114            InternalKey => "INTERNAL_KEY",
115            InternalIndex => "INTERNAL_INDEX",
116            Unknown => "UNKNOWN",
117        }
118    }
119}
120
121impl std::fmt::Display for ErrorCode {
122    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
123        f.write_str(self.as_str())
124    }
125}
126
127#[cfg(test)]
128mod tests {
129    use super::*;
130    #[test]
131    fn known_codes() {
132        assert_eq!(ErrorCode::ExecNonZero.to_string(), "EXEC_NON_ZERO");
133        assert_eq!(ErrorCode::IoNotFound.as_str(), "IO_NOT_FOUND");
134        assert_eq!(ErrorCode::Unknown.as_str(), "UNKNOWN");
135    }
136}