diff --git a/cmd/jet/main.go b/cmd/jet/main.go index de12d5f..2b0eaf2 100644 --- a/cmd/jet/main.go +++ b/cmd/jet/main.go @@ -366,7 +366,7 @@ func createModelTags(columnMetaData metadata.Column) []string { var tags []string switch modelJsonTag { case "snake-case": - tags = append(tags, fmt.Sprintf(`json:"%s"`, columnMetaData.Name)) + tags = append(tags, fmt.Sprintf(`json:"%s"`, snaker.CamelToSnake(columnMetaData.Name))) case "camel-case": tags = append(tags, fmt.Sprintf(`json:"%s"`, snaker.SnakeToCamel(columnMetaData.Name, false))) case "pascal-case": diff --git a/internal/3rdparty/snaker/snaker.go b/internal/3rdparty/snaker/snaker.go index 4177e1c..497774f 100644 --- a/internal/3rdparty/snaker/snaker.go +++ b/internal/3rdparty/snaker/snaker.go @@ -8,6 +8,44 @@ import ( "unicode" ) +// CamelToSnake converts a given string to snake case +func CamelToSnake(s string) string { + var result string + var words []string + var lastPos int + rs := []rune(s) + + for i := 0; i < len(rs); i++ { + if i > 0 && unicode.IsUpper(rs[i]) { + if initialism := startsWithInitialism(s[lastPos:]); initialism != "" { + words = append(words, initialism) + + i += len(initialism) - 1 + lastPos = i + continue + } + + words = append(words, s[lastPos:i]) + lastPos = i + } + } + + // append the last word + if s[lastPos:] != "" { + words = append(words, s[lastPos:]) + } + + for k, word := range words { + if k > 0 { + result += "_" + } + + result += strings.ToLower(word) + } + + return result +} + // SnakeToCamel returns a string converted from snake case to uppercase func SnakeToCamel(s string, firstLetterUppercase ...bool) string { upperCase := true @@ -48,6 +86,18 @@ func snakeToCamel(s string, upperCase bool) string { return result } +// startsWithInitialism returns the initialism if the given string begins with it +func startsWithInitialism(s string) string { + var initialism string + // the longest initialism is 5 char, the shortest 2 + for i := 1; i <= 5; i++ { + if len(s) > i-1 && commonInitialisms[s[:i]] { + initialism = s[:i] + } + } + return initialism +} + func toLowerFirstLetter(s string) string { if s == "" { return s