pub mod domain {
pub const INVARIANT_EMPTY: &str = "E_HEX_001";
pub const INVARIANT_VIOLATION: &str = "E_HEX_002";
pub const INVALID_STATE_TRANSITION: &str = "E_HEX_003";
}
pub mod port {
pub const COMMUNICATION_FAILURE: &str = "E_HEX_100";
pub const PORT_NOT_FOUND: &str = "E_HEX_101";
pub const PORT_TIMEOUT: &str = "E_HEX_102";
}
pub mod adapter {
pub const DB_CONNECTION_FAILURE: &str = "E_HEX_200";
pub const API_FAILURE: &str = "E_HEX_201";
pub const MAPPING_FAILURE: &str = "E_HEX_202";
}
pub mod validation {
pub const REQUIRED_FIELD: &str = "E_HEX_300";
pub const INVALID_FORMAT: &str = "E_HEX_301";
pub const OUT_OF_RANGE: &str = "E_HEX_302";
}
pub mod resource {
pub const NOT_FOUND: &str = "E_HEX_400";
pub const ALREADY_EXISTS: &str = "E_HEX_401";
pub const CONFLICT: &str = "E_HEX_402";
}
pub mod io {
pub const FILE_NOT_FOUND: &str = "E_HEX_500";
pub const PERMISSION_DENIED: &str = "E_HEX_501";
pub const IO_FAILURE: &str = "E_HEX_502";
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_codes_unique() {
let codes = vec![
domain::INVARIANT_EMPTY,
domain::INVARIANT_VIOLATION,
domain::INVALID_STATE_TRANSITION,
port::COMMUNICATION_FAILURE,
port::PORT_NOT_FOUND,
port::PORT_TIMEOUT,
adapter::DB_CONNECTION_FAILURE,
adapter::API_FAILURE,
adapter::MAPPING_FAILURE,
validation::REQUIRED_FIELD,
validation::INVALID_FORMAT,
validation::OUT_OF_RANGE,
resource::NOT_FOUND,
resource::ALREADY_EXISTS,
resource::CONFLICT,
io::FILE_NOT_FOUND,
io::PERMISSION_DENIED,
io::IO_FAILURE,
];
let unique_codes: std::collections::HashSet<_> = codes.iter().collect();
assert_eq!(
codes.len(),
unique_codes.len(),
"All error codes must be unique"
);
}
#[test]
fn test_error_code_format() {
let codes = vec![
domain::INVARIANT_EMPTY,
port::COMMUNICATION_FAILURE,
adapter::DB_CONNECTION_FAILURE,
io::FILE_NOT_FOUND,
];
for code in codes {
assert!(
code.starts_with("E_HEX_"),
"Error code must start with E_HEX_"
);
assert_eq!(code.len(), 9, "Error code must be 9 characters");
}
}
}