use crate::prelude::{DbmsError, Validate, Value};
pub struct RgbColorValidator;
impl Validate for RgbColorValidator {
fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
let Value::Text(text) = value else {
return Err(DbmsError::Validation(
"RGB color validation requires a text value".to_string(),
));
};
let s = &text.0;
if s.len() != 7 || !s.starts_with('#') {
return Err(DbmsError::Validation(
"Invalid RGB color format".to_string(),
));
}
for c in s.chars().skip(1) {
if !c.is_ascii_hexdigit() {
return Err(DbmsError::Validation(
"Invalid RGB color format".to_string(),
));
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::prelude::{Text, Value};
#[test]
fn test_rgb_color_validator() {
let validator = RgbColorValidator;
let value = Value::Text(Text("#1A2B3C".to_string()));
assert!(validator.validate(&value).is_ok());
let value = Value::Text(Text("#1A2B3".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("1A2B3C".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("#1A2B3G".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Int32(123i32.into());
assert!(validator.validate(&value).is_err());
}
}