Skip to main content

hyperstack_idl/
utils.rs

1//! Utility functions
2
3/// Convert PascalCase or camelCase to snake_case
4pub fn to_snake_case(s: &str) -> String {
5    let mut result = String::new();
6
7    for c in s.chars() {
8        if c.is_uppercase() {
9            if !result.is_empty() {
10                result.push('_');
11            }
12            result.push(c.to_lowercase().next().unwrap());
13        } else {
14            result.push(c);
15        }
16    }
17
18    result
19}
20
21/// Convert snake_case to PascalCase
22pub fn to_pascal_case(s: &str) -> String {
23    s.split('_')
24        .map(|word| {
25            let mut chars = word.chars();
26            match chars.next() {
27                None => String::new(),
28                Some(f) => f.to_uppercase().collect::<String>() + chars.as_str(),
29            }
30        })
31        .collect()
32}
33
34#[cfg(test)]
35mod tests {
36    use super::*;
37
38    #[test]
39    fn test_case_conversion() {
40        assert_eq!(to_snake_case("PoolState"), "pool_state");
41        assert_eq!(to_snake_case("LbPair"), "lb_pair");
42        assert_eq!(to_snake_case("initialize"), "initialize");
43        assert_eq!(to_snake_case("MyIDL"), "my_i_d_l");
44
45        assert_eq!(to_pascal_case("pool_state"), "PoolState");
46        assert_eq!(to_pascal_case("lb_pair"), "LbPair");
47        assert_eq!(to_pascal_case("initialize"), "Initialize");
48    }
49}