-
Notifications
You must be signed in to change notification settings - Fork 2
/
validators.go
94 lines (83 loc) · 2.1 KB
/
validators.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package generator
import (
"bytes"
"fmt"
"io"
"strings"
"text/template"
"github.com/kepkin/gorest/internal/generator/translator"
)
var validateTemplate = template.Must(template.New("validate").Funcs(template.FuncMap{
"MakeFieldValidators": makeFieldValidators,
}).Parse(`
func (t {{ .Name }}) Validate() (errors []FieldError) {
{{- range $, $field := .Fields }}
{{- if ne $field.GoType "ContentType" }}
// {{ $field.Name }} field validators{{ if or $field.IsStruct $field.IsComponent }}
errors = t.{{ $field.Name }}.Validate()
if errors != nil {
return
}
{{- else -}}
{{ MakeFieldValidators $field }}
{{- end -}}
{{- end -}}
{{ end }}
return
}
`))
func (g Generator) makeValidateFunc(wr io.Writer, def translator.TypeDef) error {
return validateTemplate.Execute(wr, def)
}
type validatorGenerator func(translator.Field) (string, error)
func makeFieldValidators(f translator.Field) (string, error) {
result := strings.Builder{}
for _, makeValidator := range [...]validatorGenerator{
makeEnumValidator,
} {
v, err := makeValidator(f)
if err != nil {
return "", err
}
if v != "" {
result.WriteString(v)
}
}
return result.String(), nil
}
var enumValidator = template.Must(template.New("enumValidator").Parse(`
var {{ .Parameter }}InEnum bool
for _, elem := range [...]{{ .GoType }}{
{{- range $_, $val := .Schema.Enum }}
{{- if $.IsString }}
"{{ $val }}",
{{- else }}
{{ $val }},
{{- end }}
{{- end }}
} {
if elem == t.{{ $.Name }} {
{{ .Parameter }}InEnum = true
break
}
}
if !{{ .Parameter }}InEnum {
errors = append(errors, NewFieldError(UndefinedPlace, "{{ .Parameter }}", "allowed values: {{ .Schema.Enum }}", nil))
}
`))
func makeEnumValidator(f translator.Field) (string, error) {
if len(f.Schema.Enum) == 0 {
return "", nil
}
switch f.Type {
case translator.IntegerField, translator.FloatField, translator.StringField:
break
default:
return "", fmt.Errorf("enum doen't support for type: %s", f.Schema.Type)
}
b := &bytes.Buffer{}
if err := enumValidator.Execute(b, f); err != nil {
return "", err
}
return b.String(), nil
}