use toml::Value;
pub fn length_min(input: &str, min_length: &Value) -> Result<(), String> {
if let Some(min) = min_length.as_integer() {
let min_usize = min as usize;
if input.chars().count() < min_usize {
return Err(format!(
"Input must be at least {} characters long",
min_usize
));
}
Ok(())
} else {
Err("Invalid length_min validation. Min length must be an integer.".to_string())
}
}
pub fn length_max(input: &str, max_length: &Value) -> Result<(), String> {
if let Some(max) = max_length.as_integer() {
let max_usize = max as usize;
if input.chars().count() > max_usize {
return Err(format!("Input must not exceed {} characters", max_usize));
}
Ok(())
} else {
Err("Invalid length_max validation. Max length must be an integer.".to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
use toml::Value;
#[test]
fn test_length_min_valid() {
let min_length = Value::Integer(3);
assert!(length_min("abc", &min_length).is_ok());
assert!(length_min("abcdef", &min_length).is_ok());
let result = length_min("ab", &min_length);
assert!(result.is_err());
assert!(result.unwrap_err().contains("at least 3 characters"));
}
#[test]
fn test_length_min_invalid_type() {
let min_length = Value::String("3".to_string());
let result = length_min("test", &min_length);
assert!(result.is_err());
assert!(result.unwrap_err().contains("must be an integer"));
}
#[test]
fn test_length_max_valid() {
let max_length = Value::Integer(5);
assert!(length_max("", &max_length).is_ok());
assert!(length_max("abc", &max_length).is_ok());
assert!(length_max("abcde", &max_length).is_ok());
let result = length_max("abcdef", &max_length);
assert!(result.is_err());
assert!(result.unwrap_err().contains("not exceed 5 characters"));
}
#[test]
fn test_length_max_invalid_type() {
let max_length = Value::String("5".to_string());
let result = length_max("test", &max_length);
assert!(result.is_err());
assert!(result.unwrap_err().contains("must be an integer"));
}
#[test]
fn test_length_unicode() {
let min_length = Value::Integer(3);
let max_length = Value::Integer(5);
let unicode_string = "a💻c";
assert!(length_min(unicode_string, &min_length).is_ok());
assert!(length_max(unicode_string, &max_length).is_ok());
}
}