diff --git a/snake.go b/snake.go index 0ec6d64..1af946b 100644 --- a/snake.go +++ b/snake.go @@ -11,9 +11,17 @@ func ToSnake(s string) string { s = strings.Trim(s, " ") n := "" for i, v := range s { - if i > 0 && v >= 'A' && v <= 'Z' && n[len(n)-1] != '_' { + // treat acronyms as words, eg for JSONData -> JSON is a whole word + nextIsCapital := false + if i + 1 < len(s) { + w := s[i+1] + nextIsCapital = w >= 'A' && w <= 'Z' + } + if i > 0 && v >= 'A' && v <= 'Z' && n[len(n)-1] != '_' && !nextIsCapital { + // add underscore if next letter is a capital n += "_" + string(v) } else if v == ' ' { + // replace spaces with underscores n += "_" } else { n = n + string(v) diff --git a/snake_test.go b/snake_test.go index a0cb26d..a90ad4f 100644 --- a/snake_test.go +++ b/snake_test.go @@ -20,6 +20,7 @@ func TestToSnake(t *testing.T) { []string{"manyManyWords", "many_many_words"}, []string{"AnyKind of_string", "any_kind_of_string"}, []string{"numbers2and55with000", "numbers_2_and_55_with_000"}, + []string{"JSONData", "json_data"}, } for _, i := range cases { in := i[0]