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/Cargo.toml | 1 - macros/src/util/string.rs | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 29 insertions(+), 11 deletions(-) (limited to 'macros') diff --git a/macros/Cargo.toml b/macros/Cargo.toml index b9d2e68..6f27311 100644 --- a/macros/Cargo.toml +++ b/macros/Cargo.toml @@ -25,7 +25,6 @@ syn = { version = "1.0.96", features = ["full"] } quote = "1.0.18" proc-macro2 = "1.0.40" uuid = { version = "0.8", features = ["v4"] } -regex = "1.6.0" once_cell = "1.13.1" thiserror = "1.0.37" proc-macro-error = "1.0.4" 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