ic_dbms_api/dbms/sanitize/
url_encoding.rs

1use crate::prelude::{IcDbmsResult, Sanitize, Value};
2
3/// Sanitizer URL-encodes strings by converting them to percent-encoded format.
4///
5/// # Example
6///
7/// ```rust
8/// use ic_dbms_api::prelude::{UrlEncodingSanitizer, Value, Sanitize as _};
9///
10/// let value = Value::Text("你好 rust".into());
11/// let sanitizer = UrlEncodingSanitizer;
12/// let sanitized_value = sanitizer.sanitize(value).unwrap();
13/// assert_eq!(sanitized_value, Value::Text("%E4%BD%A0%E5%A5%BD%20rust".into()));
14/// ```
15pub struct UrlEncodingSanitizer;
16
17impl Sanitize for UrlEncodingSanitizer {
18    fn sanitize(&self, value: Value) -> IcDbmsResult<Value> {
19        match value {
20            Value::Text(text) => {
21                let encoded = percent_encoding::utf8_percent_encode(
22                    text.as_str(),
23                    percent_encoding::NON_ALPHANUMERIC,
24                )
25                .to_string();
26                Ok(Value::Text(encoded.into()))
27            }
28            other => Ok(other),
29        }
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_url_encoding_sanitizer() {
39        let sanitizer = UrlEncodingSanitizer;
40        let string_value = Value::Text("你好 rust".into());
41        let number_value = Value::Int32(42.into());
42
43        let sanitized_string = sanitizer.sanitize(string_value).unwrap();
44        let sanitized_number = sanitizer.sanitize(number_value).unwrap();
45
46        assert_eq!(
47            sanitized_string,
48            Value::Text("%E4%BD%A0%E5%A5%BD%20rust".into())
49        );
50        assert_eq!(sanitized_number, Value::Int32(42.into()));
51    }
52}