Skip to main content

ic_dbms_api/dbms/sanitize/
collapse_whitespace.rs

1use crate::prelude::{IcDbmsResult, Sanitize, Value};
2
3/// Sanitizer that collapses multiple whitespace characters into a single space in strings.
4///
5/// # Example
6///
7/// ```rust
8/// use ic_dbms_api::prelude::{CollapseWhitespaceSanitizer, Value, Sanitize as _};
9///
10/// let value = Value::Text("  Hello,       World!  ".into());
11/// let sanitizer = CollapseWhitespaceSanitizer;
12/// let sanitized_value = sanitizer.sanitize(value).unwrap();
13/// assert_eq!(sanitized_value, Value::Text("Hello, World!".into()));
14/// ```
15pub struct CollapseWhitespaceSanitizer;
16
17impl Sanitize for CollapseWhitespaceSanitizer {
18    fn sanitize(&self, value: Value) -> IcDbmsResult<Value> {
19        match value {
20            Value::Text(text) => Ok(Value::Text(
21                text.as_str()
22                    .split_whitespace()
23                    .collect::<Vec<_>>()
24                    .join(" ")
25                    .trim()
26                    .into(),
27            )),
28            other => Ok(other),
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35
36    use super::*;
37
38    #[test]
39    fn test_collapse_whitespace_sanitizer() {
40        let sanitizer = CollapseWhitespaceSanitizer;
41        let string_with_whitespace = Value::Text("  Hello,          World!  ".into());
42        let string_without_whitespace = Value::Text("Hello".into());
43        let number_value = Value::Int32(42.into());
44
45        let sanitized_with_whitespace = sanitizer.sanitize(string_with_whitespace).unwrap();
46        let sanitized_without_whitespace = sanitizer.sanitize(string_without_whitespace).unwrap();
47        let sanitized_number = sanitizer.sanitize(number_value).unwrap();
48
49        assert_eq!(
50            sanitized_with_whitespace,
51            Value::Text("Hello, World!".into())
52        );
53        assert_eq!(sanitized_without_whitespace, Value::Text("Hello".into()));
54        assert_eq!(sanitized_number, Value::Int32(42.into()));
55    }
56}