| // copy-paste from Google Protobuf |
| // must be kept in sync with Google for JSON interop |
| #[doc(hidden)] |
| pub fn camel_case(input: &str) -> String { |
| let mut capitalize_next = true; |
| let mut result = String::new(); |
| result.reserve(input.len()); |
| |
| for c in input.chars() { |
| if c == '_' { |
| capitalize_next = true; |
| } else if capitalize_next { |
| result.push(c.to_ascii_uppercase()); |
| capitalize_next = false; |
| } else { |
| result.push(c); |
| } |
| } |
| |
| result |
| } |
| |
| #[doc(hidden)] |
| pub fn snake_case(input: &str) -> String { |
| let mut result = String::new(); |
| |
| let mut last_lower = false; |
| |
| for c in input.chars() { |
| if c.is_ascii_uppercase() && last_lower { |
| result.push('_'); |
| } |
| result.push(c.to_ascii_lowercase()); |
| last_lower = c.is_lowercase(); |
| } |
| |
| result |
| } |
| |
| #[cfg(test)] |
| mod test { |
| use super::*; |
| |
| #[test] |
| fn test_camel_case() { |
| assert_eq!("FooBarBazQuxQUUX", camel_case("foo_barBaz_QuxQUUX")); |
| assert_eq!("FooBarBazQuxQUUX", camel_case("Foo_barBaz_QuxQUUX")); |
| } |
| |
| #[test] |
| fn test_snake_case() { |
| assert_eq!("foo_bar_baz_qux_quux", snake_case("foo_barBaz_QuxQUUX")); |
| assert_eq!("foo_bar_baz_qux_quux", snake_case("Foo_barBaz_QuxQUUX")); |
| } |
| } |