Skip to content

Commit 4a0bce2

Browse files
sbresStephanetinyzimmer
authored
feat: Null enums types (#1485)
* Generate Null Enum type - We need to import driver to comply with the Valuer interface. - The Scan method uses the Scan from the Non Null Enum type * Map Custom Null enum type with database typing function * regen examples and internal endtoend tests - Regen with the Null types * Add Enum examples with nullable fields * Add NullableEnum output to e2e test * Update generated files with correct version . Co-authored-by: Stephane <sbres@coinshares.com> Co-authored-by: Avi Zimmerman <avi.zimmerman@gmail.com>
1 parent a49cfec commit 4a0bce2

File tree

49 files changed

+1497
-14
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1497
-14
lines changed

examples/batch/postgresql/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/booktest/mysql/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/booktest/postgresql/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/ondeck/mysql/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/ondeck/postgresql/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/codegen/golang/imports.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ func (i *importer) modelImports() fileImports {
264264

265265
if len(i.Enums) > 0 {
266266
std["fmt"] = struct{}{}
267+
std["database/sql/driver"] = struct{}{}
267268
}
268269

269270
return sortedImports(std, pkg)

internal/codegen/golang/mysql_type.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,17 @@ func mysqlType(req *plugin.CodeGenRequest, col *plugin.Column) string {
8686
for _, schema := range req.Catalog.Schemas {
8787
for _, enum := range schema.Enums {
8888
if enum.Name == columnType {
89-
if schema.Name == req.Catalog.DefaultSchema {
90-
return StructName(enum.Name, req.Settings)
89+
if notNull {
90+
if schema.Name == req.Catalog.DefaultSchema {
91+
return StructName(enum.Name, req.Settings)
92+
}
93+
return StructName(schema.Name+"_"+enum.Name, req.Settings)
94+
} else {
95+
if schema.Name == req.Catalog.DefaultSchema {
96+
return "Null" + StructName(enum.Name, req.Settings)
97+
}
98+
return "Null" + StructName(schema.Name+"_"+enum.Name, req.Settings)
9199
}
92-
return StructName(schema.Name+"_"+enum.Name, req.Settings)
93100
}
94101
}
95102
}

internal/codegen/golang/postgresql_type.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,17 @@ func postgresType(req *plugin.CodeGenRequest, col *plugin.Column) string {
280280

281281
for _, enum := range schema.Enums {
282282
if rel.Name == enum.Name && rel.Schema == schema.Name {
283-
if schema.Name == req.Catalog.DefaultSchema {
284-
return StructName(enum.Name, req.Settings)
283+
if notNull {
284+
if schema.Name == req.Catalog.DefaultSchema {
285+
return StructName(enum.Name, req.Settings)
286+
}
287+
return StructName(schema.Name+"_"+enum.Name, req.Settings)
288+
} else {
289+
if schema.Name == req.Catalog.DefaultSchema {
290+
return "Null" + StructName(enum.Name, req.Settings)
291+
}
292+
return "Null" + StructName(schema.Name+"_"+enum.Name, req.Settings)
285293
}
286-
return StructName(schema.Name+"_"+enum.Name, req.Settings)
287294
}
288295
}
289296

internal/codegen/golang/templates/template.tmpl

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,30 @@ func (e *{{.Name}}) Scan(src interface{}) error {
8787
return nil
8888
}
8989

90+
type Null{{.Name}} struct {
91+
{{.Name}} {{.Name}}
92+
Valid bool // Valid is true if String is not NULL
93+
}
94+
95+
// Scan implements the Scanner interface.
96+
func (ns *Null{{.Name}}) Scan(value interface{}) error {
97+
if value == nil {
98+
ns.{{.Name}}, ns.Valid = "", false
99+
return nil
100+
}
101+
ns.Valid = true
102+
return ns.{{.Name}}.Scan(value)
103+
}
104+
105+
// Value implements the driver Valuer interface.
106+
func (ns Null{{.Name}}) Value() (driver.Value, error) {
107+
if !ns.Valid {
108+
return nil, nil
109+
}
110+
return ns.{{.Name}}, nil
111+
}
112+
113+
90114
{{ if $.EmitEnumValidMethod }}
91115
func (e {{.Name}}) Valid() bool {
92116
switch e {

internal/endtoend/testdata/comment_on/postgresql/pgx/go/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/comment_on/postgresql/stdlib/go/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/ddl_alter_type_add_value/postgresql/pgx/go/models.go

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)