/
enum.go
112 lines (107 loc) · 2.35 KB
/
enum.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package main
import "github.com/golang/protobuf/protoc-gen-go/descriptor"
func (fg *FileGenerator) GenerateEnumDefinition(prefix string, inEnum *descriptor.EnumDescriptorProto) error {
typeName := prefix + inEnum.GetName()
fg.P("")
fg.P("")
fg.P("type %s", typeName)
{
fg.In()
leading := "="
for _, enumValue := range inEnum.GetValue() {
// TODO: Convert names to CamelCase.
fg.P("%s %s -- %d", leading, prefix+elmEnumValueName(enumValue.GetName()), enumValue.GetNumber())
leading = "|"
}
fg.Out()
}
return nil
}
func (fg *FileGenerator) GenerateEnumDecoder(prefix string, inEnum *descriptor.EnumDescriptorProto) error {
typeName := prefix + inEnum.GetName()
decoderName := decoderName(typeName)
fg.P("")
fg.P("")
fg.P("%s : JD.Decoder %s", decoderName, typeName)
fg.P("%s =", decoderName)
{
fg.In()
fg.P("let")
{
fg.In()
fg.P("lookup s =")
fg.In()
fg.P("case s of")
{
fg.In()
for _, enumValue := range inEnum.GetValue() {
fg.P("%q ->", enumValue.GetName())
fg.In()
fg.P("%s", prefix+elmEnumValueName(enumValue.GetName()))
fg.P("")
fg.Out()
}
// TODO: This should fail instead.
fg.P("_ ->")
fg.In()
fg.P("%s", prefix+elmEnumValueName(inEnum.GetValue()[0].GetName()))
fg.Out()
fg.Out()
}
fg.Out()
fg.Out()
}
fg.P("in")
{
fg.In()
fg.P("JD.map lookup JD.string")
fg.Out()
}
fg.Out()
}
defaultName := defaultEnumValue(typeName)
fg.P("")
fg.P("")
fg.P("%s : %s", defaultName, typeName)
fg.P("%s = %s", defaultName, prefix+elmEnumValueName(inEnum.GetValue()[0].GetName()))
return nil
}
func (fg *FileGenerator) GenerateEnumEncoder(prefix string, inEnum *descriptor.EnumDescriptorProto) error {
typeName := prefix + inEnum.GetName()
argName := "v"
fg.P("")
fg.P("")
fg.P("%s : %s -> JE.Value", encoderName(typeName), typeName)
fg.P("%s %s =", encoderName(typeName), argName)
{
fg.In()
fg.P("let")
{
fg.In()
fg.P("lookup s =")
fg.In()
fg.P("case s of")
{
fg.In()
for _, enumValue := range inEnum.GetValue() {
fg.P("%s ->", prefix+elmEnumValueName(enumValue.GetName()))
fg.In()
fg.P("%q", enumValue.GetName())
fg.P("")
fg.Out()
}
fg.Out()
}
fg.Out()
fg.Out()
}
fg.P("in")
{
fg.In()
fg.P("JE.string <| lookup %s", argName)
fg.Out()
}
fg.Out()
}
return nil
}