@@ -2647,34 +2647,46 @@ pub fn (s string) camel_to_snake() string {
2647
2647
if s.len == 0 {
2648
2648
return ''
2649
2649
}
2650
- lower_first_char := if s[0 ] > = `A` && s[0 ] < = `Z` { s[0 ] + 32 } else { s[0 ] }
2651
2650
if s.len == 1 {
2652
- return lower_first_char. ascii_str ()
2651
+ return s. to_lower ()
2653
2652
}
2654
2653
mut b := unsafe { malloc_noscan (2 * s.len + 1 ) }
2655
- second_char := if s[1 ] > = `A` && s[1 ] < = `Z` { `_` } else { s[1 ] }
2654
+ mut prev_is_upper := false
2655
+ first_char , second_char := if s[0 ] > = `A` && s[0 ] < = `Z` {
2656
+ lower_first_c := if s[0 ] > = `A` && s[0 ] < = `Z` { s[0 ] + 32 } else { s[0 ] }
2657
+ lower_second_c := if s[1 ] > = `A` && s[1 ] < = `Z` {
2658
+ prev_is_upper = true
2659
+ s[1 ] + 32
2660
+ } else {
2661
+ s[1 ]
2662
+ }
2663
+ lower_first_c, lower_second_c
2664
+ } else {
2665
+ lower_first_c := s[0 ]
2666
+ second_c := if s[1 ] > = `A` && s[1 ] < = `Z` { u8 (`_` ) } else { s[1 ] }
2667
+ lower_first_c, second_c
2668
+ }
2656
2669
unsafe {
2657
- b[0 ] = lower_first_char
2670
+ b[0 ] = first_char
2658
2671
b[1 ] = second_char
2659
2672
}
2673
+ mut pos := 2
2660
2674
mut prev_char := second_char
2661
- mut prev_is_upper := false
2662
2675
mut lower_c := `_`
2663
2676
mut c_is_upper := false
2664
- mut pos := 1
2665
2677
for i in pos .. s.len {
2666
2678
c := s[i]
2667
2679
c_is_upper = c > = `A` && c < = `Z`
2668
2680
lower_c = if c_is_upper { c + 32 } else { c }
2669
- if prev_is_upper == false && c_is_upper {
2681
+ if ! prev_is_upper && c_is_upper {
2670
2682
// aB => a_b, if prev has `_`, then do not add `_`
2671
2683
unsafe {
2672
2684
if b[pos - 1 ] != `_` {
2673
2685
b[pos] = `_`
2674
2686
pos++
2675
2687
}
2676
2688
}
2677
- } else if prev_is_upper && c_is_upper == false && c != `_` {
2689
+ } else if prev_is_upper && ! c_is_upper && c != `_` {
2678
2690
// Ba => _ba, if prev has `_`, then do not add `_`
2679
2691
unsafe {
2680
2692
if b[pos - 2 ] != `_` {
0 commit comments