[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

@ -74,6 +74,7 @@ func GenerateTemplate(templateText string, templateData interface{}, dialect jet
t, err := template.New("sqlBuilderTableTemplate").Funcs(template.FuncMap{ t, err := template.New("sqlBuilderTableTemplate").Funcs(template.FuncMap{
"ToGoIdentifier": utils.ToGoIdentifier, "ToGoIdentifier": utils.ToGoIdentifier,
"ToGoEnumValueIdentifier": utils.ToGoEnumValueIdentifier,
"now": func() string { "now": func() string {
return time.Now().Format(time.RFC850) return time.Now().Format(time.RFC850)
}, },

View file

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

View file

@ -10,6 +10,7 @@ import (
"reflect" "reflect"
"strings" "strings"
"time" "time"
"unicode"
) )
// ToGoIdentifier converts database to Go identifier. // ToGoIdentifier converts database to Go identifier.
@ -17,6 +18,15 @@ func ToGoIdentifier(databaseIdentifier string) string {
return snaker.SnakeToCamel(replaceInvalidChars(databaseIdentifier)) 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. // ToGoFileName converts database identifier to Go file name.
func ToGoFileName(databaseIdentifier string) string { func ToGoFileName(databaseIdentifier string) string {
return strings.ToLower(replaceInvalidChars(databaseIdentifier)) return strings.ToLower(replaceInvalidChars(databaseIdentifier))

View file

@ -25,6 +25,11 @@ func TestToGoIdentifier(t *testing.T) {
assert.Equal(t, ToGoIdentifier("My-Table"), "MyTable") 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) { func TestErrorCatchErr(t *testing.T) {
var err error var err error

View file

@ -283,14 +283,15 @@ func TestGeneratedAllTypesSQLBuilderFiles(t *testing.T) {
enumFiles, err := ioutil.ReadDir(enumDir) enumFiles, err := ioutil.ReadDir(enumDir)
assert.NoError(t, err) 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+"mood.go", "\npackage enum", moodEnumContent)
testutils.AssertFileContent(t, enumDir+"level.go", "\npackage enum", levelEnumContent)
modelFiles, err := ioutil.ReadDir(modelDir) modelFiles, err := ioutil.ReadDir(modelDir)
assert.NoError(t, err) assert.NoError(t, err)
testutils.AssertFileNamesEqual(t, modelFiles, "all_types.go", "all_types_view.go", "employee.go", "link.go", 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) 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 = ` var allTypesModelContent = `
package model package model