use crate::prelude::{DbmsResult, Sanitize, Value};
pub struct SlugSanitizer;
impl Sanitize for SlugSanitizer {
fn sanitize(&self, value: Value) -> DbmsResult<Value> {
match value {
Value::Text(text) => {
let slug = text
.as_str()
.to_lowercase()
.split_whitespace()
.collect::<Vec<_>>()
.join("-")
.chars()
.filter(|c| c.is_alphanumeric() || *c == '-')
.collect::<String>();
Ok(Value::Text(slug.into()))
}
other => Ok(other),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_slug_sanitizer() {
let sanitizer = SlugSanitizer;
let string_value = Value::Text(" Hello, World! ".into());
let number_value = Value::Int32(42.into());
let sanitized_string = sanitizer.sanitize(string_value).unwrap();
let sanitized_number = sanitizer.sanitize(number_value).unwrap();
assert_eq!(sanitized_string, Value::Text("hello-world".into()));
assert_eq!(sanitized_number, Value::Int32(42.into()));
}
}