use crate::prelude::{Validate, Value};
pub struct SnakeCaseValidator;
impl Validate for SnakeCaseValidator {
fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
let Value::Text(text) = value else {
return Err(crate::prelude::DbmsError::Validation(
"RGB color validation requires a text value".to_string(),
));
};
let s = &text.0;
let first_char = s.chars().next().ok_or_else(|| {
crate::prelude::DbmsError::Validation(
"Empty string is not valid snake_case".to_string(),
)
})?;
if !first_char.is_lowercase() && first_char != '_' {
return Err(crate::prelude::DbmsError::Validation(format!(
"Value '{s}' is not in snake_case format",
)));
}
if s.chars()
.all(|c| c.is_lowercase() || c.is_ascii_digit() || c == '_')
{
Ok(())
} else {
Err(crate::prelude::DbmsError::Validation(format!(
"Value '{s}' is not in snake_case format",
)))
}
}
}
pub struct KebabCaseValidator;
impl Validate for KebabCaseValidator {
fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
let Value::Text(text) = value else {
return Err(crate::prelude::DbmsError::Validation(
"RGB color validation requires a text value".to_string(),
));
};
let s = &text.0;
let first_char = s.chars().next().ok_or_else(|| {
crate::prelude::DbmsError::Validation(
"Empty string is not valid kebab-case".to_string(),
)
})?;
if !first_char.is_lowercase() {
return Err(crate::prelude::DbmsError::Validation(format!(
"Value '{s}' is not in kebab-case format",
)));
}
if s.chars()
.all(|c| c.is_lowercase() || c.is_ascii_digit() || c == '-')
{
Ok(())
} else {
Err(crate::prelude::DbmsError::Validation(format!(
"Value '{s}' is not in kebab-case format",
)))
}
}
}
pub struct CamelCaseValidator;
impl Validate for CamelCaseValidator {
fn validate(&self, value: &Value) -> crate::prelude::DbmsResult<()> {
let Value::Text(text) = value else {
return Err(crate::prelude::DbmsError::Validation(
"CamelCase validation requires a text value".to_string(),
));
};
let s = &text.0;
let mut chars = s.chars();
let first_char = chars.next().ok_or_else(|| {
crate::prelude::DbmsError::Validation("Empty string is not valid CamelCase".to_string())
})?;
if !first_char.is_uppercase() {
return Err(crate::prelude::DbmsError::Validation(format!(
"Value '{s}' is not in CamelCase format"
)));
}
if s.chars().all(|c| c.is_alphanumeric()) {
Ok(())
} else {
Err(crate::prelude::DbmsError::Validation(format!(
"Value '{}' is not in CamelCase format",
s
)))
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::prelude::{Text, Value};
#[test]
fn test_snake_case_validator() {
let validator = SnakeCaseValidator;
let value = Value::Text(Text("valid_snake_case".to_string()));
assert!(validator.validate(&value).is_ok());
let value = Value::Text(Text("Invalid_Snake_Case".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("invalid-snake-case!".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("1invalid_snake_case".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("_valid_snake_case".to_string()));
assert!(validator.validate(&value).is_ok());
let value = Value::Text(Text("".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Int32(123i32.into());
assert!(validator.validate(&value).is_err());
}
#[test]
fn test_kebab_case_validator() {
let validator = KebabCaseValidator;
let value = Value::Text(Text("valid-kebab-case".to_string()));
assert!(validator.validate(&value).is_ok());
let value = Value::Text(Text("Invalid-Kebab-Case".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("invalid-kebab-case!".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("1invalid-kebab-case".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Int32(123i32.into());
assert!(validator.validate(&value).is_err());
}
#[test]
fn test_camel_case_validator() {
let validator = CamelCaseValidator;
let value = Value::Text(Text("ValidCamelCase".to_string()));
assert!(validator.validate(&value).is_ok());
let value = Value::Text(Text("invalidCamelCase".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("Invalid-CamelCase!".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("Invalid_CamelCase".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Text(Text("".to_string()));
assert!(validator.validate(&value).is_err());
let value = Value::Int32(123i32.into());
assert!(validator.validate(&value).is_err());
}
}