-
Notifications
You must be signed in to change notification settings - Fork 0
/
decoders.go.tmpl
50 lines (38 loc) · 1.35 KB
/
decoders.go.tmpl
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
{{- define "decoders" -}}
{{- $typeMap := .TypeMap -}}
{{- $types := .Types -}}
-- DECODERS
{{ range $_, $type := $types -}}
{{- if eq $type.Kind "enum" -}}
{{$type.Name | camelCase}}Decoder : Decoder {{$type.Name}}
{{$type.Name | camelCase}}Decoder =
let
enumDecoder : String -> Decoder {{$type.Name}}
enumDecoder str =
case str of
{{- range $i, $field := $type.Fields}}
"{{$field.Name}}" ->
Decode.succeed {{ $type.Name }}{{$field.Name}}
{{ end }}
_ ->
Decode.fail ("unknown value for type {{ $type.Name }}: " ++ str)
in
Decode.string |> Decode.andThen enumDecoder
{{ end -}}
{{- if eq $type.Kind "struct" -}}
{{$type.Name | camelCase}}Decoder : Decoder {{$type.Name}}
{{$type.Name | camelCase}}Decoder =
Decode.succeed {{$type.Name}}
{{- range $field := $type.Fields }}
{{- $jsonKey := $field.Name }}
{{- range $meta := $field.Meta }}
{{- if exists $meta "json" }}
{{- $jsonKey = (get $meta "json") }}
{{- end }}
{{- end }}
|> andMap (
{{- if $field.Optional -}}decodeOptionalField{{- else -}}Decode.field{{- end }} "{{- $jsonKey -}}" {{ template "decoder" dict "Type" $field.Type "TypeMap" $typeMap}})
{{- end }}
{{ end -}}
{{- end -}}
{{- end -}}