Skip to content

Commit b33a65c

Browse files
author
Alex Bice
committed
fix: move parse logic to go
1 parent 8dfcd72 commit b33a65c

3 files changed

Lines changed: 43 additions & 72 deletions

File tree

generator/enum.tmpl

Lines changed: 10 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ const (
3636
{{- end}}
3737
{{- end}}
3838
)
39-
{{- $parseNeeded := or .mustparse .marshal .anySQLEnabled .flag -}}
40-
{{- if or (not .noparse) $parseNeeded }}
39+
{{- if .generateError }}
4140
{{if .names -}}
4241
var ErrInvalid{{.enum.Name}} = fmt.Errorf("not a valid {{.enum.Name}}, try [%s]", strings.Join(_{{.enum.Name}}Names, ", "))
4342
{{- else -}}
@@ -66,13 +65,9 @@ func (x {{.enum.Name}}) IsValid() bool {
6665

6766
var _{{.enum.Name}}Value = {{ unmapify .enum .lowercase }}
6867

69-
{{- $parseName := "Parse" -}}
70-
{{- if and .noparse $parseNeeded -}}
71-
{{- $parseName = "parse" -}}
72-
{{- end -}}
73-
{{- if or (not .noparse) $parseNeeded }}
74-
// {{$parseName}}{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
75-
func {{$parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
68+
{{- if .generateParse }}
69+
// {{.parseName}}{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
70+
func {{.parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
7671
if x, ok := _{{.enum.Name}}Value[name]; ok {
7772
return x, nil
7873
}{{if .nocase }}
@@ -85,13 +80,9 @@ func {{$parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
8580
{{- end }}
8681

8782
{{ if .mustparse }}
88-
{{- $parseName := "Parse" -}}
89-
{{- if .noparse -}}
90-
{{- $parseName = "parse" -}}
91-
{{- end }}
9283
// MustParse{{.enum.Name}} converts a string to a {{.enum.Name}}, and panics if is not valid.
9384
func MustParse{{.enum.Name}}(name string) {{.enum.Name}} {
94-
val, err := {{$parseName}}{{.enum.Name}}(name)
85+
val, err := {{.parseName}}{{.enum.Name}}(name)
9586
if err != nil {
9687
panic(err)
9788
}
@@ -106,10 +97,6 @@ func (x {{.enum.Name}}) Ptr() *{{.enum.Name}} {
10697
{{end}}
10798

10899
{{ if .marshal }}
109-
{{- $parseName := "Parse" -}}
110-
{{- if .noparse -}}
111-
{{- $parseName = "parse" -}}
112-
{{- end }}
113100
// MarshalText implements the text marshaller method.
114101
func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
115102
return []byte(x.String()), nil
@@ -118,7 +105,7 @@ func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
118105
// UnmarshalText implements the text unmarshaller method.
119106
func (x *{{.enum.Name}}) UnmarshalText(text []byte) error {
120107
name := string(text)
121-
tmp, err := {{$parseName}}{{.enum.Name}}(name)
108+
tmp, err := {{.parseName}}{{.enum.Name}}(name)
122109
if err != nil {
123110
return err
124111
}
@@ -136,10 +123,6 @@ func (x *{{.enum.Name}}) AppendText(b []byte) ([]byte, error) {
136123
{{end}}
137124

138125
{{ if or .sql .sqlnullint .sqlnullstr}}
139-
{{- $parseName := "Parse" -}}
140-
{{- if .noparse -}}
141-
{{- $parseName = "parse" -}}
142-
{{- end }}
143126
var err{{.enum.Name}}NilPtr = errors.New("value pointer is nil") // one per type for package clashes
144127

145128
// Scan implements the Scanner interface.
@@ -155,15 +138,15 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
155138
case int64:
156139
*x = {{.enum.Name}}(v)
157140
case string:
158-
*x, err = {{$parseName}}{{.enum.Name}}(v){{if .sqlnullint }}
141+
*x, err = {{.parseName}}{{.enum.Name}}(v){{if .sqlnullint }}
159142
if err != nil {
160143
// try parsing the integer value as a string
161144
if val, verr := strconv.Atoi(v); verr == nil {
162145
*x, err = {{.enum.Name}}(val), nil
163146
}
164147
}{{end}}
165148
case []byte:
166-
*x, err = {{$parseName}}{{.enum.Name}}(string(v)){{if .sqlnullint }}
149+
*x, err = {{.parseName}}{{.enum.Name}}(string(v)){{if .sqlnullint }}
167150
if err != nil {
168151
// try parsing the integer value as a string
169152
if val, verr := strconv.Atoi(string(v)); verr == nil {
@@ -214,7 +197,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
214197
if v == nil{
215198
return err{{.enum.Name}}NilPtr
216199
}
217-
*x, err = {{$parseName}}{{.enum.Name}}(*v){{if .sqlnullint }}
200+
*x, err = {{.parseName}}{{.enum.Name}}(*v){{if .sqlnullint }}
218201
if err != nil {
219202
// try parsing the integer value as a string
220203
if val, verr := strconv.Atoi(*v); verr == nil {
@@ -242,13 +225,9 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
242225

243226

244227
{{ if .flag }}
245-
{{- $parseName := "Parse" -}}
246-
{{- if .noparse -}}
247-
{{- $parseName = "parse" -}}
248-
{{- end }}
249228
// Set implements the Golang flag.Value interface func.
250229
func (x *{{.enum.Name}}) Set(val string) error {
251-
v, err := {{$parseName}}{{.enum.Name}}(val)
230+
v, err := {{.parseName}}{{.enum.Name}}(val)
252231
*x = v
253232
return err
254233
}

generator/enum_string.tmpl

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ const (
1313
{{$value.PrefixedName}} {{$enumName}} = {{quote $value.ValueStr}}
1414
{{- end}}
1515
)
16-
{{- $parseNeeded := or .mustparse .marshal .anySQLEnabled .flag -}}
17-
{{- if or (not .noparse) $parseNeeded .sqlint }}
16+
{{- if .generateError }}
1817
{{if .names -}}
1918
var ErrInvalid{{.enum.Name}} = fmt.Errorf("not a valid {{.enum.Name}}, try [%s]", strings.Join(_{{.enum.Name}}Names, ", "))
2019
{{- else -}}
@@ -48,17 +47,12 @@ func {{.enum.Name}}Values() []{{.enum.Name}} {
4847
func (x {{.enum.Name}}) String() string {
4948
return string(x)
5049
}
51-
{{- $parseNeeded := or .mustparse .marshal .anySQLEnabled .flag }}
52-
{{- $parseName := "Parse" }}
53-
{{- if and .noparse $parseNeeded }}
54-
{{- $parseName = "parse" }}
55-
{{- end }}
5650

5751
// IsValid provides a quick way to determine if the typed value is
5852
// part of the allowed enumerated values
5953
func (x {{.enum.Name}}) IsValid() bool {
60-
{{- if or (not .noparse) $parseNeeded }}
61-
_, err := {{$parseName}}{{.enum.Name}}(string(x))
54+
{{- if .generateParse }}
55+
_, err := {{.parseName}}{{.enum.Name}}(string(x))
6256
return err == nil
6357
{{- else }}
6458
_, ok := _{{.enum.Name}}Value[string(x)]
@@ -68,9 +62,9 @@ func (x {{.enum.Name}}) IsValid() bool {
6862

6963
var _{{.enum.Name}}Value = {{ unmapify .enum .lowercase }}
7064

71-
{{- if or (not .noparse) $parseNeeded }}
72-
// {{$parseName}}{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
73-
func {{$parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
65+
{{- if .generateParse }}
66+
// {{.parseName}}{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
67+
func {{.parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
7468
if x, ok := _{{.enum.Name}}Value[name]; ok {
7569
return x, nil
7670
}{{if .nocase }}
@@ -83,13 +77,9 @@ func {{$parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
8377
{{- end }}
8478

8579
{{ if .mustparse }}
86-
{{- $parseName := "Parse" -}}
87-
{{- if .noparse -}}
88-
{{- $parseName = "parse" -}}
89-
{{- end }}
9080
// MustParse{{.enum.Name}} converts a string to a {{.enum.Name}}, and panics if is not valid.
9181
func MustParse{{.enum.Name}}(name string) {{.enum.Name}} {
92-
val, err := {{$parseName}}{{.enum.Name}}(name)
82+
val, err := {{.parseName}}{{.enum.Name}}(name)
9383
if err != nil {
9484
panic(err)
9585
}
@@ -104,18 +94,14 @@ func (x {{.enum.Name}}) Ptr() *{{.enum.Name}} {
10494
{{end}}
10595

10696
{{ if .marshal }}
107-
{{- $parseName := "Parse" -}}
108-
{{- if .noparse -}}
109-
{{- $parseName = "parse" -}}
110-
{{- end }}
11197
// MarshalText implements the text marshaller method.
11298
func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
11399
return []byte(string(x)), nil
114100
}
115101

116102
// UnmarshalText implements the text unmarshaller method.
117103
func (x *{{.enum.Name}}) UnmarshalText(text []byte) error {
118-
tmp, err := {{$parseName}}{{.enum.Name}}(string(text))
104+
tmp, err := {{.parseName}}{{.enum.Name}}(string(text))
119105
if err != nil {
120106
return err
121107
}
@@ -138,10 +124,6 @@ var err{{.enum.Name}}NilPtr = errors.New("value pointer is nil") // one per type
138124

139125
{{/* SQL stored as a string value */}}
140126
{{ if or .sql .sqlnullstr }}
141-
{{- $parseName := "Parse" -}}
142-
{{- if .noparse -}}
143-
{{- $parseName = "parse" -}}
144-
{{- end }}
145127

146128
// Scan implements the Scanner interface.
147129
func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
@@ -154,9 +136,9 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
154136
// driver.Value values at the top of the list for expediency
155137
switch v := value.(type) {
156138
case string:
157-
*x, err = {{$parseName}}{{.enum.Name}}(v)
139+
*x, err = {{.parseName}}{{.enum.Name}}(v)
158140
case []byte:
159-
*x, err = {{$parseName}}{{.enum.Name}}(string(v))
141+
*x, err = {{.parseName}}{{.enum.Name}}(string(v))
160142
case {{.enum.Name}}:
161143
*x = v
162144
case *{{.enum.Name}}:
@@ -168,7 +150,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
168150
if v == nil{
169151
return err{{.enum.Name}}NilPtr
170152
}
171-
*x, err = {{$parseName}}{{.enum.Name}}(*v)
153+
*x, err = {{.parseName}}{{.enum.Name}}(*v)
172154
default:
173155
return errors.New("invalid type for {{.enum.Name}}")
174156
}
@@ -184,10 +166,6 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
184166

185167
{{/* SQL stored as an integer value */}}
186168
{{ if or .sqlint .sqlnullint }}
187-
{{- $parseName := "Parse" -}}
188-
{{- if .noparse -}}
189-
{{- $parseName = "parse" -}}
190-
{{- end }}
191169
var sqlInt{{.enum.Name}}Map = map[int64]{{.enum.Name}}{ {{ range $rIndex, $value := .enum.Values }}{{ if ne $value.Name "_"}}
192170
{{ $value.ValueInt }}: {{ $value.PrefixedName }},{{end}}
193171
{{- end}}
@@ -219,13 +197,13 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
219197
case int64:
220198
*x, err = lookupSqlInt{{.enum.Name}}(v)
221199
case string:
222-
*x, err = {{$parseName}}{{.enum.Name}}(v)
200+
*x, err = {{.parseName}}{{.enum.Name}}(v)
223201
case []byte:
224202
if val, verr := strconv.ParseInt(string(v), 10, 64); verr == nil {
225203
*x, err = lookupSqlInt{{.enum.Name}}(val)
226204
} else {
227205
// try parsing the value as a string
228-
*x, err = {{$parseName}}{{.enum.Name}}(string(v))
206+
*x, err = {{.parseName}}{{.enum.Name}}(string(v))
229207
}
230208
case {{.enum.Name}}:
231209
*x = v
@@ -271,7 +249,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
271249
if v == nil{
272250
return err{{.enum.Name}}NilPtr
273251
}
274-
*x, err = {{$parseName}}{{.enum.Name}}(*v)
252+
*x, err = {{.parseName}}{{.enum.Name}}(*v)
275253
default:
276254
return errors.New("invalid type for {{.enum.Name}}")
277255
}
@@ -292,13 +270,9 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
292270

293271

294272
{{ if .flag }}
295-
{{- $parseName := "Parse" -}}
296-
{{- if .noparse -}}
297-
{{- $parseName = "parse" -}}
298-
{{- end }}
299273
// Set implements the Golang flag.Value interface func.
300274
func (x *{{.enum.Name}}) Set(val string) error {
301-
v, err := {{$parseName}}{{.enum.Name}}(val)
275+
v, err := {{.parseName}}{{.enum.Name}}(val)
302276
*x = v
303277
return err
304278
}

generator/generator.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,19 @@ func (g *Generator) Generate(f *ast.File) ([]byte, error) {
193193
}
194194

195195
created++
196+
197+
// Determine parse method generation logic
198+
parseNeeded := g.MustParse || g.Marshal || g.anySQLEnabled() || g.Flag
199+
generateParse := !g.NoParse || parseNeeded
200+
parseIsPublic := !g.NoParse
201+
parseName := "Parse"
202+
if !parseIsPublic && generateParse {
203+
parseName = "parse"
204+
}
205+
206+
// Determine if error variable is needed
207+
generateError := generateParse || (enum.Type == "string" && g.SQLInt)
208+
196209
data := map[string]any{
197210
"enum": enum,
198211
"name": name,
@@ -214,6 +227,11 @@ func (g *Generator) Generate(f *ast.File) ([]byte, error) {
214227
"forcelower": g.ForceLower,
215228
"forceupper": g.ForceUpper,
216229
"noparse": g.NoParse,
230+
// Computed values for cleaner templates
231+
"generateParse": generateParse,
232+
"parseIsPublic": parseIsPublic,
233+
"parseName": parseName,
234+
"generateError": generateError,
217235
}
218236

219237
templateName := "enum"

0 commit comments

Comments
 (0)