buup/transformers/
snake_to_camel.rs

1use crate::{Transform, TransformError, TransformerCategory};
2
3/// SnakeToCamel transformer converts snake_case to camelCase
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
5pub struct SnakeToCamel;
6
7/// Default test input for Snake to Camel
8pub const DEFAULT_TEST_INPUT: &str = "my_variable_name";
9
10impl Transform for SnakeToCamel {
11    fn name(&self) -> &'static str {
12        "Snake Case to CamelCase"
13    }
14
15    fn id(&self) -> &'static str {
16        "snaketocamel"
17    }
18
19    fn description(&self) -> &'static str {
20        "Converts snake_case to camelCase"
21    }
22
23    fn category(&self) -> TransformerCategory {
24        TransformerCategory::Other
25    }
26
27    fn transform(&self, input: &str) -> Result<String, TransformError> {
28        if input.is_empty() {
29            return Ok(String::new());
30        }
31
32        let mut result = String::with_capacity(input.len());
33        let mut capitalize_next = false;
34
35        for (i, c) in input.chars().enumerate() {
36            if c == '_' {
37                capitalize_next = true;
38            } else if capitalize_next {
39                result.push(c.to_ascii_uppercase());
40                capitalize_next = false;
41            } else if i == 0 {
42                result.push(c.to_ascii_lowercase());
43            } else {
44                result.push(c);
45            }
46        }
47
48        Ok(result)
49    }
50
51    fn default_test_input(&self) -> &'static str {
52        "convert_this_snake_case_string"
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59
60    #[test]
61    fn test_snake_to_camel() {
62        let transformer = SnakeToCamel;
63
64        // Test default input
65        assert_eq!(
66            transformer.transform(DEFAULT_TEST_INPUT).unwrap(),
67            "myVariableName"
68        );
69
70        // Test basic snake_case inputs
71        assert_eq!(transformer.transform("hello_world").unwrap(), "helloWorld");
72        assert_eq!(
73            transformer
74                .transform("this_is_a_snake_case_string")
75                .unwrap(),
76            "thisIsASnakeCaseString"
77        );
78
79        // Test empty input
80        assert_eq!(transformer.transform("").unwrap(), "");
81
82        // Test single word
83        assert_eq!(transformer.transform("hello").unwrap(), "hello");
84
85        // Test with numbers
86        assert_eq!(transformer.transform("get_2_items").unwrap(), "get2Items");
87        assert_eq!(
88            transformer.transform("find_item_42_in_list").unwrap(),
89            "findItem42InList"
90        );
91
92        // Test with consecutive underscores
93        assert_eq!(transformer.transform("hello__world").unwrap(), "helloWorld");
94
95        // Test with trailing underscore
96        assert_eq!(transformer.transform("hello_").unwrap(), "hello");
97
98        // Test with leading underscore
99        assert_eq!(transformer.transform("_hello").unwrap(), "Hello");
100    }
101}