Skip to content

Commit 1edbe01

Browse files
author
Alex Bice
committed
feat: add a noparse method to prevent the parsing function from being created.
1 parent 6e74858 commit 1edbe01

7 files changed

Lines changed: 588 additions & 20 deletions

File tree

generator/enum.tmpl

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,14 @@ func (x {{.enum.Name}}) IsValid() bool {
6363

6464
var _{{.enum.Name}}Value = {{ unmapify .enum .lowercase }}
6565

66-
// Parse{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
67-
func Parse{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
66+
{{- $parseNeeded := or .mustparse .marshal .anySQLEnabled .flag -}}
67+
{{- $parseName := "Parse" -}}
68+
{{- if and .noparse $parseNeeded -}}
69+
{{- $parseName = "parse" -}}
70+
{{- end -}}
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) {
6874
if x, ok := _{{.enum.Name}}Value[name]; ok {
6975
return x, nil
7076
}{{if .nocase }}
@@ -74,11 +80,16 @@ func Parse{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
7480
}{{- end}}
7581
return {{.enum.Name}}(0), fmt.Errorf("%s is %w", name, ErrInvalid{{.enum.Name}})
7682
}
83+
{{- end }}
7784

7885
{{ if .mustparse }}
86+
{{- $parseName := "Parse" -}}
87+
{{- if .noparse -}}
88+
{{- $parseName = "parse" -}}
89+
{{- end }}
7990
// MustParse{{.enum.Name}} converts a string to a {{.enum.Name}}, and panics if is not valid.
8091
func MustParse{{.enum.Name}}(name string) {{.enum.Name}} {
81-
val, err := Parse{{.enum.Name}}(name)
92+
val, err := {{$parseName}}{{.enum.Name}}(name)
8293
if err != nil {
8394
panic(err)
8495
}
@@ -93,6 +104,10 @@ func (x {{.enum.Name}}) Ptr() *{{.enum.Name}} {
93104
{{end}}
94105

95106
{{ if .marshal }}
107+
{{- $parseName := "Parse" -}}
108+
{{- if .noparse -}}
109+
{{- $parseName = "parse" -}}
110+
{{- end }}
96111
// MarshalText implements the text marshaller method.
97112
func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
98113
return []byte(x.String()), nil
@@ -101,7 +116,7 @@ func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
101116
// UnmarshalText implements the text unmarshaller method.
102117
func (x *{{.enum.Name}}) UnmarshalText(text []byte) error {
103118
name := string(text)
104-
tmp, err := Parse{{.enum.Name}}(name)
119+
tmp, err := {{$parseName}}{{.enum.Name}}(name)
105120
if err != nil {
106121
return err
107122
}
@@ -119,6 +134,10 @@ func (x *{{.enum.Name}}) AppendText(b []byte) ([]byte, error) {
119134
{{end}}
120135

121136
{{ if or .sql .sqlnullint .sqlnullstr}}
137+
{{- $parseName := "Parse" -}}
138+
{{- if .noparse -}}
139+
{{- $parseName = "parse" -}}
140+
{{- end }}
122141
var err{{.enum.Name}}NilPtr = errors.New("value pointer is nil") // one per type for package clashes
123142

124143
// Scan implements the Scanner interface.
@@ -134,15 +153,15 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
134153
case int64:
135154
*x = {{.enum.Name}}(v)
136155
case string:
137-
*x, err = Parse{{.enum.Name}}(v){{if .sqlnullint }}
156+
*x, err = {{$parseName}}{{.enum.Name}}(v){{if .sqlnullint }}
138157
if err != nil {
139158
// try parsing the integer value as a string
140159
if val, verr := strconv.Atoi(v); verr == nil {
141160
*x, err = {{.enum.Name}}(val), nil
142161
}
143162
}{{end}}
144163
case []byte:
145-
*x, err = Parse{{.enum.Name}}(string(v)){{if .sqlnullint }}
164+
*x, err = {{$parseName}}{{.enum.Name}}(string(v)){{if .sqlnullint }}
146165
if err != nil {
147166
// try parsing the integer value as a string
148167
if val, verr := strconv.Atoi(string(v)); verr == nil {
@@ -193,7 +212,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
193212
if v == nil{
194213
return err{{.enum.Name}}NilPtr
195214
}
196-
*x, err = Parse{{.enum.Name}}(*v){{if .sqlnullint }}
215+
*x, err = {{$parseName}}{{.enum.Name}}(*v){{if .sqlnullint }}
197216
if err != nil {
198217
// try parsing the integer value as a string
199218
if val, verr := strconv.Atoi(*v); verr == nil {
@@ -221,9 +240,13 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
221240

222241

223242
{{ if .flag }}
243+
{{- $parseName := "Parse" -}}
244+
{{- if .noparse -}}
245+
{{- $parseName = "parse" -}}
246+
{{- end }}
224247
// Set implements the Golang flag.Value interface func.
225248
func (x *{{.enum.Name}}) Set(val string) error {
226-
v, err := Parse{{.enum.Name}}(val)
249+
v, err := {{$parseName}}{{.enum.Name}}(val)
227250
*x = v
228251
return err
229252
}

generator/enum_string.tmpl

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,29 @@ func {{.enum.Name}}Values() []{{.enum.Name}} {
4545
func (x {{.enum.Name}}) String() string {
4646
return string(x)
4747
}
48+
{{- $parseNeeded := or .mustparse .marshal .anySQLEnabled .flag }}
49+
{{- $parseName := "Parse" }}
50+
{{- if and .noparse $parseNeeded }}
51+
{{- $parseName = "parse" }}
52+
{{- end }}
4853

4954
// IsValid provides a quick way to determine if the typed value is
5055
// part of the allowed enumerated values
5156
func (x {{.enum.Name}}) IsValid() bool {
52-
_, err := Parse{{.enum.Name}}(string(x))
57+
{{- if or (not .noparse) $parseNeeded }}
58+
_, err := {{$parseName}}{{.enum.Name}}(string(x))
5359
return err == nil
60+
{{- else }}
61+
_, ok := _{{.enum.Name}}Value[string(x)]
62+
return ok
63+
{{- end }}
5464
}
5565

5666
var _{{.enum.Name}}Value = {{ unmapify .enum .lowercase }}
5767

58-
// Parse{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
59-
func Parse{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
68+
{{- if or (not .noparse) $parseNeeded }}
69+
// {{$parseName}}{{.enum.Name}} attempts to convert a string to a {{.enum.Name}}.
70+
func {{$parseName}}{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
6071
if x, ok := _{{.enum.Name}}Value[name]; ok {
6172
return x, nil
6273
}{{if .nocase }}
@@ -66,11 +77,16 @@ func Parse{{.enum.Name}}(name string) ({{.enum.Name}}, error) {
6677
}{{- end}}
6778
return {{.enum.Name}}(""), fmt.Errorf("%s is %w", name, ErrInvalid{{.enum.Name}})
6879
}
80+
{{- end }}
6981

7082
{{ if .mustparse }}
83+
{{- $parseName := "Parse" -}}
84+
{{- if .noparse -}}
85+
{{- $parseName = "parse" -}}
86+
{{- end }}
7187
// MustParse{{.enum.Name}} converts a string to a {{.enum.Name}}, and panics if is not valid.
7288
func MustParse{{.enum.Name}}(name string) {{.enum.Name}} {
73-
val, err := Parse{{.enum.Name}}(name)
89+
val, err := {{$parseName}}{{.enum.Name}}(name)
7490
if err != nil {
7591
panic(err)
7692
}
@@ -85,14 +101,18 @@ func (x {{.enum.Name}}) Ptr() *{{.enum.Name}} {
85101
{{end}}
86102

87103
{{ if .marshal }}
104+
{{- $parseName := "Parse" -}}
105+
{{- if .noparse -}}
106+
{{- $parseName = "parse" -}}
107+
{{- end }}
88108
// MarshalText implements the text marshaller method.
89109
func (x {{.enum.Name}}) MarshalText() ([]byte, error) {
90110
return []byte(string(x)), nil
91111
}
92112

93113
// UnmarshalText implements the text unmarshaller method.
94114
func (x *{{.enum.Name}}) UnmarshalText(text []byte) error {
95-
tmp, err := Parse{{.enum.Name}}(string(text))
115+
tmp, err := {{$parseName}}{{.enum.Name}}(string(text))
96116
if err != nil {
97117
return err
98118
}
@@ -115,6 +135,10 @@ var err{{.enum.Name}}NilPtr = errors.New("value pointer is nil") // one per type
115135

116136
{{/* SQL stored as a string value */}}
117137
{{ if or .sql .sqlnullstr }}
138+
{{- $parseName := "Parse" -}}
139+
{{- if .noparse -}}
140+
{{- $parseName = "parse" -}}
141+
{{- end }}
118142

119143
// Scan implements the Scanner interface.
120144
func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
@@ -127,9 +151,9 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
127151
// driver.Value values at the top of the list for expediency
128152
switch v := value.(type) {
129153
case string:
130-
*x, err = Parse{{.enum.Name}}(v)
154+
*x, err = {{$parseName}}{{.enum.Name}}(v)
131155
case []byte:
132-
*x, err = Parse{{.enum.Name}}(string(v))
156+
*x, err = {{$parseName}}{{.enum.Name}}(string(v))
133157
case {{.enum.Name}}:
134158
*x = v
135159
case *{{.enum.Name}}:
@@ -141,7 +165,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
141165
if v == nil{
142166
return err{{.enum.Name}}NilPtr
143167
}
144-
*x, err = Parse{{.enum.Name}}(*v)
168+
*x, err = {{$parseName}}{{.enum.Name}}(*v)
145169
default:
146170
return errors.New("invalid type for {{.enum.Name}}")
147171
}
@@ -157,6 +181,10 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
157181

158182
{{/* SQL stored as an integer value */}}
159183
{{ if or .sqlint .sqlnullint }}
184+
{{- $parseName := "Parse" -}}
185+
{{- if .noparse -}}
186+
{{- $parseName = "parse" -}}
187+
{{- end }}
160188
var sqlInt{{.enum.Name}}Map = map[int64]{{.enum.Name}}{ {{ range $rIndex, $value := .enum.Values }}{{ if ne $value.Name "_"}}
161189
{{ $value.ValueInt }}: {{ $value.PrefixedName }},{{end}}
162190
{{- end}}
@@ -188,13 +216,13 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
188216
case int64:
189217
*x, err = lookupSqlInt{{.enum.Name}}(v)
190218
case string:
191-
*x, err = Parse{{.enum.Name}}(v)
219+
*x, err = {{$parseName}}{{.enum.Name}}(v)
192220
case []byte:
193221
if val, verr := strconv.ParseInt(string(v), 10, 64); verr == nil {
194222
*x, err = lookupSqlInt{{.enum.Name}}(val)
195223
} else {
196224
// try parsing the value as a string
197-
*x, err = Parse{{.enum.Name}}(string(v))
225+
*x, err = {{$parseName}}{{.enum.Name}}(string(v))
198226
}
199227
case {{.enum.Name}}:
200228
*x = v
@@ -240,7 +268,7 @@ func (x *{{.enum.Name}}) Scan(value interface{}) (err error) {
240268
if v == nil{
241269
return err{{.enum.Name}}NilPtr
242270
}
243-
*x, err = Parse{{.enum.Name}}(*v)
271+
*x, err = {{$parseName}}{{.enum.Name}}(*v)
244272
default:
245273
return errors.New("invalid type for {{.enum.Name}}")
246274
}
@@ -261,9 +289,13 @@ func (x {{.enum.Name}}) Value() (driver.Value, error) {
261289

262290

263291
{{ if .flag }}
292+
{{- $parseName := "Parse" -}}
293+
{{- if .noparse -}}
294+
{{- $parseName = "parse" -}}
295+
{{- end }}
264296
// Set implements the Golang flag.Value interface func.
265297
func (x *{{.enum.Name}}) Set(val string) error {
266-
v, err := Parse{{.enum.Name}}(val)
298+
v, err := {{$parseName}}{{.enum.Name}}(val)
267299
*x = v
268300
return err
269301
}

generator/generator.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ func (g *Generator) Generate(f *ast.File) ([]byte, error) {
213213
"mustparse": g.MustParse,
214214
"forcelower": g.ForceLower,
215215
"forceupper": g.ForceUpper,
216+
"noparse": g.NoParse,
216217
}
217218

218219
templateName := "enum"

0 commit comments

Comments
 (0)