use anyhow::{Result, bail};
pub struct StringHandler;
impl StringHandler {
pub fn validate_and_canonicalize(
value: &str,
max_length: Option<usize>,
field_name: &str,
) -> Result<String> {
if value.is_empty() {
bail!("Field '{}' cannot be empty", field_name);
}
if let Some(max_len) = max_length
&& value.len() > max_len
{
bail!(
"Field '{}' exceeds maximum length of {} characters, got: {}",
field_name,
max_len,
value.len()
);
}
Ok(value.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_string() {
let result = StringHandler::validate_and_canonicalize("test", Some(10), "field");
assert!(result.is_ok());
assert_eq!(result.unwrap(), "test");
}
#[test]
fn test_empty_string_fails() {
let result = StringHandler::validate_and_canonicalize("", Some(10), "field");
assert!(result.is_err());
assert!(result.unwrap_err().to_string().contains("cannot be empty"));
}
#[test]
fn test_too_long_string_fails() {
let result = StringHandler::validate_and_canonicalize("toolong", Some(5), "field");
assert!(result.is_err());
assert!(
result
.unwrap_err()
.to_string()
.contains("exceeds maximum length")
);
}
#[test]
fn test_no_length_limit() {
let result = StringHandler::validate_and_canonicalize("very long string", None, "field");
assert!(result.is_ok());
}
}