@@ -57,54 +57,47 @@ impl RenameRule {
5757 pub fn apply_to_variant ( self , variant : & str ) -> String {
5858 match self {
5959 None | PascalCase => variant. to_owned ( ) ,
60- LowerCase => variant. to_ascii_lowercase ( ) ,
61- UpperCase => variant. to_ascii_uppercase ( ) ,
62- CamelCase => variant [ .. 1 ] . to_ascii_lowercase ( ) + & variant [ 1 .. ] ,
63- SnakeCase => {
64- let mut snake = String :: new ( ) ;
65- for ( i , ch ) in variant . char_indices ( ) {
66- if i > 0 && ch . is_uppercase ( ) {
67- snake . push ( '_' ) ;
68- }
69- snake . push ( ch . to_ascii_lowercase ( ) ) ;
70- }
71- snake
60+ LowerCase => variant. to_lowercase ( ) ,
61+ UpperCase => variant. to_uppercase ( ) ,
62+ CamelCase => {
63+ let mut chars = variant . chars ( ) ;
64+ let Some ( first ) = chars . next ( ) else {
65+ return String :: new ( ) ;
66+ } ;
67+
68+ let mut camel = String :: with_capacity ( variant . len ( ) ) ;
69+ camel . extend ( first . to_uppercase ( ) ) ;
70+ camel . push_str ( chars . as_str ( ) ) ;
71+ camel
7272 }
73- ScreamingSnakeCase => SnakeCase . apply_to_variant ( variant) . to_ascii_uppercase ( ) ,
74- KebabCase => SnakeCase . apply_to_variant ( variant) . replace ( '_' , "-" ) ,
75- ScreamingKebabCase => ScreamingSnakeCase
76- . apply_to_variant ( variant)
77- . replace ( '_' , "-" ) ,
73+ SnakeCase => separate_pascal_case ( variant, false , '_' ) ,
74+ ScreamingSnakeCase => separate_pascal_case ( variant, true , '_' ) ,
75+ KebabCase => separate_pascal_case ( variant, false , '-' ) ,
76+ ScreamingKebabCase => separate_pascal_case ( variant, true , '-' ) ,
7877 }
7978 }
8079
8180 /// Apply a renaming rule to a struct field, returning the version expected in the source.
8281 pub fn apply_to_field ( self , field : & str ) -> String {
8382 match self {
8483 None | LowerCase | SnakeCase => field. to_owned ( ) ,
85- UpperCase => field. to_ascii_uppercase ( ) ,
86- PascalCase => {
87- let mut pascal = String :: new ( ) ;
88- let mut capitalize = true ;
89- for ch in field. chars ( ) {
90- if ch == '_' {
91- capitalize = true ;
92- } else if capitalize {
93- pascal . push ( ch . to_ascii_uppercase ( ) ) ;
94- capitalize = false ;
95- } else {
96- pascal . push ( ch ) ;
84+ UpperCase => field. to_uppercase ( ) ,
85+ PascalCase => snake_case_to_camel_case ( field , true ) ,
86+ CamelCase => snake_case_to_camel_case ( field , false ) ,
87+ ScreamingSnakeCase => field . to_uppercase ( ) ,
88+ KebabCase => field. replace ( '_' , "-" ) ,
89+ ScreamingKebabCase => {
90+ let kebab = field . to_uppercase ( ) ;
91+
92+ let mut kebab_vec = Vec :: from ( kebab ) ;
93+ for b in & mut kebab_vec {
94+ if * b == b'_' {
95+ * b = b'-' ;
9796 }
9897 }
99- pascal
100- }
101- CamelCase => {
102- let pascal = PascalCase . apply_to_field ( field) ;
103- pascal[ ..1 ] . to_ascii_lowercase ( ) + & pascal[ 1 ..]
98+ // we only replaced ASCII in place, it's still valid UTF-8
99+ String :: try_from ( kebab_vec) . unwrap ( )
104100 }
105- ScreamingSnakeCase => field. to_ascii_uppercase ( ) ,
106- KebabCase => field. replace ( '_' , "-" ) ,
107- ScreamingKebabCase => ScreamingSnakeCase . apply_to_field ( field) . replace ( '_' , "-" ) ,
108101 }
109102 }
110103
@@ -117,6 +110,37 @@ impl RenameRule {
117110 }
118111}
119112
113+ fn separate_pascal_case ( pascal : & str , screaming : bool , line : char ) -> String {
114+ let mut separated = String :: with_capacity ( pascal. len ( ) ) ;
115+ for ( i, ch) in pascal. char_indices ( ) {
116+ if i > 0 && ch. is_uppercase ( ) {
117+ separated. push ( line) ;
118+ }
119+ if screaming {
120+ separated. extend ( ch. to_uppercase ( ) ) ;
121+ } else {
122+ separated. extend ( ch. to_lowercase ( ) ) ;
123+ }
124+ }
125+ separated
126+ }
127+
128+ fn snake_case_to_camel_case ( snake : & str , pascal : bool ) -> String {
129+ let mut camel = String :: new ( ) ;
130+ let mut capitalize = pascal;
131+ for ch in snake. chars ( ) {
132+ if ch == '_' {
133+ capitalize = true ;
134+ } else if capitalize {
135+ camel. extend ( ch. to_uppercase ( ) ) ;
136+ capitalize = false ;
137+ } else {
138+ camel. push ( ch) ;
139+ }
140+ }
141+ camel
142+ }
143+
120144pub struct ParseError < ' a > {
121145 unknown : & ' a str ,
122146}
0 commit comments