From c4b0c5e5b83b5e2d406873059b3c9c839269bcb0 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Wed, 1 Jul 2026 14:03:11 +0530 Subject: [PATCH 1/2] Add snake number case --- pastey-test-suite/tests/test_item.rs | 23 +++++++++++++++++++++++ src/segment.rs | 12 ++++++++++++ 2 files changed, 35 insertions(+) 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..1a02cf1 100644 --- a/src/segment.rs +++ b/src/segment.rs @@ -220,6 +220,18 @@ pub(crate) fn paste(segments: &[Segment]) -> Result { } evaluated.push(acc.to_lowercase()); } + "snake_number" => { + let mut acc = String::new(); + let mut prev = '_'; + for ch in last.chars() { + if (ch.is_uppercase() || ch.is_numeric()) && prev != '_' { + acc.push('_'); + } + acc.push(ch); + prev = ch; + } + evaluated.push(acc.to_lowercase()); + } "camel" | "upper_camel" | "lower_camel" => { let mut is_lower_camel = ident.to_string().as_str() == "lower_camel"; let mut acc = String::new(); From ed80778777e9c5a5a9a68f80419a6f5f99cc5d21 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Wed, 1 Jul 2026 14:40:26 +0530 Subject: [PATCH 2/2] Refactor snake case transformation logic --- src/segment.rs | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/segment.rs b/src/segment.rs index 1a02cf1..d6c0610 100644 --- a/src/segment.rs +++ b/src/segment.rs @@ -208,23 +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 != '_' { - acc.push('_'); - } - acc.push(ch); - prev = ch; - } - evaluated.push(acc.to_lowercase()); - } - "snake_number" => { - let mut acc = String::new(); - let mut prev = '_'; - for ch in last.chars() { - if (ch.is_uppercase() || ch.is_numeric()) && prev != '_' { + let should_trigger_underscore = + ch.is_uppercase() || (include_numbers && ch.is_numeric()); + if should_trigger_underscore && prev != '_' { acc.push('_'); } acc.push(ch);