[bug] Fix crash on generating enum sql builder files when enum contains numeric values.

This commit is contained in:
go-jet 2020-02-15 11:20:51 +01:00
parent f154701e60
commit 63c1fd6430
5 changed files with 42 additions and 5 deletions

View file

@ -73,7 +73,8 @@ func generateGoFiles(dirPath, packageName string, template string, metaDataList
func GenerateTemplate(templateText string, templateData interface{}, dialect jet.Dialect, params ...map[string]interface{}) ([]byte, error) {
t, err := template.New("sqlBuilderTableTemplate").Funcs(template.FuncMap{
"ToGoIdentifier": utils.ToGoIdentifier,
"ToGoIdentifier": utils.ToGoIdentifier,
"ToGoEnumValueIdentifier": utils.ToGoEnumValueIdentifier,
"now": func() string {
return time.Now().Format(time.RFC850)
},

View file

@ -94,11 +94,11 @@ import "github.com/go-jet/jet/{{dialect.PackageName}}"
var {{ToGoIdentifier $.Name}} = &struct {
{{- range $index, $element := .Values}}
{{ToGoIdentifier $element}} {{dialect.PackageName}}.StringExpression
{{ToGoEnumValueIdentifier $.Name $element}} {{dialect.PackageName}}.StringExpression
{{- end}}
} {
{{- range $index, $element := .Values}}
{{ToGoIdentifier $element}}: {{dialect.PackageName}}.NewEnumValue("{{$element}}"),
{{ToGoEnumValueIdentifier $.Name $element}}: {{dialect.PackageName}}.NewEnumValue("{{$element}}"),
{{- end}}
}
`

View file

@ -10,6 +10,7 @@ import (
"reflect"
"strings"
"time"
"unicode"
)
// ToGoIdentifier converts database to Go identifier.
@ -17,6 +18,15 @@ func ToGoIdentifier(databaseIdentifier string) string {
return snaker.SnakeToCamel(replaceInvalidChars(databaseIdentifier))
}
func ToGoEnumValueIdentifier(enumName, enumValue string) string {
enumValueIdentifier := ToGoIdentifier(enumValue)
if !unicode.IsLetter([]rune(enumValueIdentifier)[0]) {
return ToGoIdentifier(enumName) + enumValueIdentifier
}
return enumValueIdentifier
}
// ToGoFileName converts database identifier to Go file name.
func ToGoFileName(databaseIdentifier string) string {
return strings.ToLower(replaceInvalidChars(databaseIdentifier))

View file

@ -25,6 +25,11 @@ func TestToGoIdentifier(t *testing.T) {
assert.Equal(t, ToGoIdentifier("My-Table"), "MyTable")
}
func TestToGoEnumValueIdentifier(t *testing.T) {
assert.Equal(t, ToGoEnumValueIdentifier("enum_name", "enum_value"), "EnumValue")
assert.Equal(t, ToGoEnumValueIdentifier("NumEnum", "100"), "NumEnum100")
}
func TestErrorCatchErr(t *testing.T) {
var err error

View file

@ -283,14 +283,15 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) {
enumFiles, err := ioutil.ReadDir(enumDir)
assert.NoError(t, err)
testutils.AssertFileNamesEqual(t, enumFiles, "mood.go")
testutils.AssertFileNamesEqual(t, enumFiles, "mood.go", "level.go")
testutils.AssertFileContent(t, enumDir+"mood.go", "\npackage enum", moodEnumContent)
testutils.AssertFileContent(t, enumDir+"level.go", "\npackage enum", levelEnumContent)
modelFiles, err := ioutil.ReadDir(modelDir)
assert.NoError(t, err)
testutils.AssertFileNamesEqual(t, modelFiles, "all_types.go", "all_types_view.go", "employee.go", "link.go",
"mood.go", "person.go", "person_phone.go", "weird_names_table.go")
"mood.go", "person.go", "person_phone.go", "weird_names_table.go", "level.go")
testutils.AssertFileContent(t, modelDir+"all_types.go", "\npackage model", allTypesModelContent)
@ -319,6 +320,26 @@ var Mood = &struct {
}
`
var levelEnumContent = `
package enum
import "github.com/go-jet/jet/postgres"
var Level = &struct {
Level1 postgres.StringExpression
Level2 postgres.StringExpression
Level3 postgres.StringExpression
Level4 postgres.StringExpression
Level5 postgres.StringExpression
}{
Level1: postgres.NewEnumValue("1"),
Level2: postgres.NewEnumValue("2"),
Level3: postgres.NewEnumValue("3"),
Level4: postgres.NewEnumValue("4"),
Level5: postgres.NewEnumValue("5"),
}
`
var allTypesModelContent = `
package model