-
Notifications
You must be signed in to change notification settings - Fork 2
/
message.go
63 lines (57 loc) · 1.53 KB
/
message.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
package proto_reader
import (
"github.com/emicklei/proto"
)
func parseMessages(result *ParseResult, definition *ProtobufDefinition) {
definition.Messages = make(map[string]*Message)
for _, m := range result.Messages {
var message Message
message.Name = m.Name
message.Comment = trimComment(m.Comment)
message.Fields = parseFields(result, m.Elements)
optKey := encodeOptionKey(messageKey, message.Name)
message.Options = parseOptions(result.Options[optKey])
definition.Messages[message.Name] = &message
}
}
func parseFields(result *ParseResult, fields []proto.Visitee) map[string]*Field {
out := make(map[string]*Field)
for _, f := range fields {
field := parseField(f)
if field == nil {
continue
}
key := encodeOptionKey(fieldKey, field.Name)
options := parseOptions(result.Options[key])
field.Options = options
out[field.Name] = field
}
return out
}
func parseField(field proto.Visitee) *Field {
switch field.(type) {
case *proto.NormalField:
casted := field.(*proto.NormalField)
return &Field{
Name: casted.Name,
Type: casted.Type,
IsRepeated: casted.Repeated,
IsMap: false,
SubType: nil,
Comment: trimComment(casted.Comment),
}
case *proto.MapField:
casted := field.(*proto.MapField)
return &Field{
Name: casted.Name,
Type: casted.KeyType,
IsRepeated: false,
IsMap: true,
SubType: &casted.Type,
Comment: trimComment(casted.Comment),
}
case *proto.OneOfField:
panic("OneOf fields are not supported")
}
return nil
}