From 1fc0371867b02127a5da63f01f03d264b382b552 Mon Sep 17 00:00:00 2001 From: HampusM Date: Mon, 25 Sep 2023 22:09:52 +0200 Subject: refactor: make camel cased text snake cased without regex --- macros/src/util/string.rs | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) (limited to 'macros/src/util') diff --git a/macros/src/util/string.rs b/macros/src/util/string.rs index a04a021..b29fe21 100644 --- a/macros/src/util/string.rs +++ b/macros/src/util/string.rs @@ -1,14 +1,28 @@ -use once_cell::sync::Lazy; -use regex::Regex; - -static CAMELCASE_RE: Lazy = Lazy::new(|| Regex::new(r"([a-z])([A-Z])").unwrap()); - pub fn camelcase_to_snakecase(camelcased: &str) -> String { - CAMELCASE_RE - .replace(camelcased, "${1}_$2") - .to_string() - .to_lowercase() + let mut prev_char_was_lowercase = false; + + camelcased + .chars() + .fold(String::new(), |mut acc, character| { + if character.is_lowercase() { + prev_char_was_lowercase = true; + + acc.push(character); + + return acc; + } + + if character.is_uppercase() && prev_char_was_lowercase { + prev_char_was_lowercase = false; + + acc.push('_'); + } + + acc.push(character.to_ascii_lowercase()); + + acc + }) } #[cfg(test)] @@ -21,6 +35,11 @@ mod tests { assert_eq!(camelcase_to_snakecase("LoginHandler"), "login_handler"); - assert_eq!(camelcase_to_snakecase("Regex"), "regex"); + assert_eq!(camelcase_to_snakecase("Transient"), "transient"); + + assert_eq!( + camelcase_to_snakecase("SystemInfoManager"), + "system_info_manager" + ); } } -- cgit v1.2.3-18-g5258