From 63932ae0d1b780edb21d4277a967288aba81d273 Mon Sep 17 00:00:00 2001 From: Bogdan State Date: Fri, 25 Dec 2020 17:43:34 +1300 Subject: [PATCH] Added test lower casing corner case + fix --- Cargo.toml | 3 +++ src/segment.rs | 12 ++---------- tests/test_item.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ec7baa1..fd6f70a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,9 @@ readme = "README.md" [lib] proc-macro = true +[dependencies] +Inflector = {version = "0.11.4"} + [dev-dependencies] paste-test-suite = { version = "0", path = "tests/macros" } rustversion = "1.0" diff --git a/src/segment.rs b/src/segment.rs index 592a047..83da2f0 100644 --- a/src/segment.rs +++ b/src/segment.rs @@ -1,4 +1,5 @@ use crate::error::{Error, Result}; +use inflector::cases::snakecase::to_snake_case; use proc_macro::{token_stream, Delimiter, Ident, Span, TokenTree}; use std::iter::Peekable; @@ -181,16 +182,7 @@ pub(crate) fn paste(segments: &[Segment]) -> Result { evaluated.push(last.to_uppercase()); } "snake" => { - let mut acc = String::new(); - let mut prev = '_'; - for ch in last.chars() { - if ch.is_uppercase() && prev != '_' { - acc.push('_'); - } - acc.push(ch); - prev = ch; - } - evaluated.push(acc.to_lowercase()); + evaluated.push(to_snake_case(&last)); } "camel" => { let mut acc = String::new(); diff --git a/tests/test_item.rs b/tests/test_item.rs index 86c98a9..4f1bb91 100644 --- a/tests/test_item.rs +++ b/tests/test_item.rs @@ -138,6 +138,32 @@ mod test_to_snake { } } +mod test_to_snake_acme { + use inflector::cases::screamingsnakecase::to_screaming_snake_case; + use inflector::cases::snakecase::to_snake_case; + use paste::paste; + + macro_rules! m { + ($id:ident) => { + paste! { + const RAW: &str = stringify!([<$id>]); + const LOWER_SNAKE: &str = stringify!([<$id:snake:lower>]); + const UPPER_SNAKE: &str = stringify!([<$id:snake:upper>]); + } + }; + } + m!(ACMECorp); + + #[test] + fn test_to_snake_acme() { + let lower_snake_inflector: &str = &to_snake_case(RAW); + let screaming_snake_inflector: &str = &to_screaming_snake_case(RAW); + + assert_eq!(LOWER_SNAKE, lower_snake_inflector); + assert_eq!(UPPER_SNAKE, screaming_snake_inflector); + } +} + mod test_to_camel { use paste::paste;