-
Notifications
You must be signed in to change notification settings - Fork 0
/
filed.go
79 lines (67 loc) · 1.39 KB
/
filed.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
package protokit
import (
"strings"
"google.golang.org/protobuf/types/descriptorpb"
)
func IsRepeatedField(f *descriptorpb.FieldDescriptorProto) bool {
if f == nil {
return false
}
if f.Type != nil && f.Label != nil && *f.Label == descriptorpb.FieldDescriptorProto_LABEL_REPEATED {
return true
}
return false
}
func IsEnumField(f *descriptorpb.FieldDescriptorProto) bool {
if f == nil {
return false
}
if f.Type != nil && f.Label != nil && *f.Type == descriptorpb.FieldDescriptorProto_TYPE_ENUM {
return true
}
return false
}
func IsMessageField(f *descriptorpb.FieldDescriptorProto) bool {
if f == nil {
return false
}
if f.Type != nil && f.Label != nil && *f.Type == descriptorpb.FieldDescriptorProto_TYPE_MESSAGE {
return true
}
return false
}
func shortType(s string) string {
t := strings.Split(s, ".")
return t[len(t)-1]
}
func IsMapField(f *descriptorpb.FieldDescriptorProto, m *descriptorpb.DescriptorProto) bool {
if f.TypeName == nil {
return false
}
shortName := shortType(*f.TypeName)
var nt *descriptorpb.DescriptorProto
for _, t := range m.NestedType {
if *t.Name == shortName {
nt = t
break
}
}
if nt == nil {
return false
}
for _, f := range nt.Field {
switch *f.Name {
case "key":
if *f.Number != 1 {
return false
}
case "value":
if *f.Number != 2 {
return false
}
default:
return false
}
}
return true
}