use anyhow::{Result, bail};
pub struct EnumHandler;
impl EnumHandler {
pub fn validate_and_canonicalize(
value: &str,
allowed_values: &[String],
field_name: &str,
) -> Result<String> {
let lowercase_value = value.to_lowercase();
let is_valid = allowed_values
.iter()
.any(|allowed| allowed.to_lowercase() == lowercase_value);
if is_valid {
tracing::debug!(
field_name = field_name,
input_value = value,
canonical_value = %lowercase_value,
allowed_count = allowed_values.len(),
"Enum value successfully validated and canonicalized"
);
Ok(lowercase_value)
} else {
bail!(
"Field '{}' has invalid value '{}'. Allowed: [{}]",
field_name,
value,
allowed_values.join(", ")
);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_enum_value_exact_case() {
let allowed = vec![
"active".to_string(),
"inactive".to_string(),
"pending".to_string(),
];
let result = EnumHandler::validate_and_canonicalize("active", &allowed, "status");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "active");
}
#[test]
fn test_valid_enum_value_different_case() {
let allowed = vec!["active".to_string(), "inactive".to_string()];
let result = EnumHandler::validate_and_canonicalize("ACTIVE", &allowed, "status");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "active");
}
#[test]
fn test_valid_enum_value_mixed_case() {
let allowed = vec!["Active".to_string(), "InActive".to_string()];
let result = EnumHandler::validate_and_canonicalize("active", &allowed, "status");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "active");
}
#[test]
fn test_invalid_enum_value() {
let allowed = vec!["active".to_string(), "inactive".to_string()];
let result = EnumHandler::validate_and_canonicalize("unknown", &allowed, "status");
assert!(result.is_err());
}
#[test]
fn test_empty_allowed_values() {
let allowed = vec![];
let result = EnumHandler::validate_and_canonicalize("any", &allowed, "field");
assert!(result.is_err());
}
#[test]
fn test_large_allowed_values_list() {
let allowed: Vec<String> = (0..20).map(|i| format!("value{}", i)).collect();
let result = EnumHandler::validate_and_canonicalize("unknown", &allowed, "field");
assert!(result.is_err());
}
}