diff --git a/pastey-test-suite/tests/test_item.rs b/pastey-test-suite/tests/test_item.rs index c46aa68..be4bc2b 100644 --- a/pastey-test-suite/tests/test_item.rs +++ b/pastey-test-suite/tests/test_item.rs @@ -140,6 +140,29 @@ mod test_to_snake { } } +mod test_to_snake_number { + use pastey::paste; + + macro_rules! m { + ($id:ident) => { + paste! { + const DEFAULT_SNAKE_NUMBER: &str = stringify!([<$id:snake_number>]); + const LOWER_SNAKE_NUMBER: &str = stringify!([<$id:snake_number:lower>]); + const UPPER_SNAKE_NUMBER: &str = stringify!([<$id:snake_number:upper>]); + } + }; + } + + m!(ThisIsButA1Test); + + #[test] + fn test_to_snake_number() { + assert_eq!(DEFAULT_SNAKE_NUMBER, "this_is_but_a_1_test"); + assert_eq!(LOWER_SNAKE_NUMBER, "this_is_but_a_1_test"); + assert_eq!(UPPER_SNAKE_NUMBER, "THIS_IS_BUT_A_1_TEST"); + } +} + mod test_to_camel { use pastey::paste; diff --git a/src/segment.rs b/src/segment.rs index 764966c..d6c0610 100644 --- a/src/segment.rs +++ b/src/segment.rs @@ -208,11 +208,14 @@ pub(crate) fn paste(segments: &[Segment]) -> Result { "upper" => { evaluated.push(last.to_uppercase()); } - "snake" => { + "snake" | "snake_number" => { let mut acc = String::new(); let mut prev = '_'; + let include_numbers = ident.to_string().as_str() == "snake_number"; for ch in last.chars() { - if ch.is_uppercase() && prev != '_' { + let should_trigger_underscore = + ch.is_uppercase() || (include_numbers && ch.is_numeric()); + if should_trigger_underscore && prev != '_' { acc.push('_'); } acc.push(ch);