skp_validator_rules/transform/
case.rs

1//! Case transformation rules (uppercase, lowercase).
2
3use skp_validator_core::Transform;
4
5/// Uppercase transformation - converts string to uppercase.
6///
7/// # Example
8///
9/// ```rust
10/// use skp_validator_rules::transform::case::UppercaseTransform;
11/// use skp_validator_core::Transform;
12///
13/// let transform = UppercaseTransform;
14/// assert_eq!(transform.transform("hello".to_string()), "HELLO");
15/// ```
16#[derive(Debug, Clone, Copy, Default)]
17pub struct UppercaseTransform;
18
19impl Transform<String> for UppercaseTransform {
20    fn transform(&self, value: String) -> String {
21        value.to_uppercase()
22    }
23
24    fn name(&self) -> &'static str {
25        "uppercase"
26    }
27}
28
29/// Lowercase transformation - converts string to lowercase.
30///
31/// # Example
32///
33/// ```rust
34/// use skp_validator_rules::transform::case::LowercaseTransform;
35/// use skp_validator_core::Transform;
36///
37/// let transform = LowercaseTransform;
38/// assert_eq!(transform.transform("HELLO".to_string()), "hello");
39/// ```
40#[derive(Debug, Clone, Copy, Default)]
41pub struct LowercaseTransform;
42
43impl Transform<String> for LowercaseTransform {
44    fn transform(&self, value: String) -> String {
45        value.to_lowercase()
46    }
47
48    fn name(&self) -> &'static str {
49        "lowercase"
50    }
51}
52
53/// Capitalize transformation - capitalizes first letter of each word.
54///
55/// # Example
56///
57/// ```rust
58/// use skp_validator_rules::transform::case::CapitalizeTransform;
59/// use skp_validator_core::Transform;
60///
61/// let transform = CapitalizeTransform;
62/// assert_eq!(transform.transform("hello world".to_string()), "Hello World");
63/// ```
64#[derive(Debug, Clone, Copy, Default)]
65pub struct CapitalizeTransform;
66
67impl Transform<String> for CapitalizeTransform {
68    fn transform(&self, value: String) -> String {
69        value
70            .split_whitespace()
71            .map(|word| {
72                let mut chars = word.chars();
73                match chars.next() {
74                    None => String::new(),
75                    Some(first) => first.to_uppercase().chain(chars).collect(),
76                }
77            })
78            .collect::<Vec<_>>()
79            .join(" ")
80    }
81
82    fn name(&self) -> &'static str {
83        "capitalize"
84    }
85}
86
87#[cfg(test)]
88mod tests {
89    use super::*;
90
91    #[test]
92    fn test_uppercase() {
93        let transform = UppercaseTransform;
94        assert_eq!(transform.transform("hello".to_string()), "HELLO");
95        assert_eq!(transform.transform("Hello World".to_string()), "HELLO WORLD");
96        assert_eq!(transform.transform("123abc".to_string()), "123ABC");
97    }
98
99    #[test]
100    fn test_lowercase() {
101        let transform = LowercaseTransform;
102        assert_eq!(transform.transform("HELLO".to_string()), "hello");
103        assert_eq!(transform.transform("Hello World".to_string()), "hello world");
104    }
105
106    #[test]
107    fn test_capitalize() {
108        let transform = CapitalizeTransform;
109        assert_eq!(transform.transform("hello world".to_string()), "Hello World");
110        assert_eq!(transform.transform("HELLO WORLD".to_string()), "HELLO WORLD");
111    }
112}