[bug] Fix crash on generating enum sql builder files when enum contains numeric values.
This commit is contained in:
parent
f154701e60
commit
63c1fd6430
5 changed files with 42 additions and 5 deletions
|
|
@ -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)
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -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}}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
|
||||||
|
|
@ -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))
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue