blob: 26810850f9c515a0a69fb0eedda29fad3d94ab5c (
plain)
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
113
114
115
116
117
118
119
120
|
package main
import "strings"
// Package represents collection of objects parsed from VPP binary API JSON data
type Package struct {
APIVersion string
Enums []Enum
Unions []Union
Types []Type
Messages []Message
Services []Service
RefMap map[string]string
}
// MessageType represents the type of a VPP message
type MessageType int
const (
requestMessage MessageType = iota // VPP request message
replyMessage // VPP reply message
eventMessage // VPP event message
otherMessage // other VPP message
)
// Message represents VPP binary API message
type Message struct {
Name string
CRC string
Fields []Field
}
// Type represents VPP binary API type
type Type struct {
Name string
CRC string
Fields []Field
}
// Union represents VPP binary API union
type Union struct {
Name string
CRC string
Fields []Field
}
// Field represents VPP binary API object field
type Field struct {
Name string
Type string
Length int
SizeFrom string
}
func (f *Field) IsArray() bool {
return f.Length > 0 || f.SizeFrom != ""
}
// Enum represents VPP binary API enum
type Enum struct {
Name string
Type string
Entries []EnumEntry
}
// EnumEntry represents VPP binary API enum entry
type EnumEntry struct {
Name string
Value interface{}
}
// Service represents VPP binary API service
type Service struct {
Name string
RequestType string
ReplyType string
Stream bool
Events []string
}
func (s Service) MethodName() string {
reqTyp := camelCaseName(s.RequestType)
// method name is same as parameter type name by default
method := reqTyp
if s.Stream {
// use Dump as prefix instead of suffix for stream services
if m := strings.TrimSuffix(method, "Dump"); method != m {
method = "Dump" + m
}
}
return method
}
func (s Service) IsDumpService() bool {
return s.Stream
}
func (s Service) IsEventService() bool {
return len(s.Events) > 0
}
func (s Service) IsRequestService() bool {
// some binapi messages might have `null` reply (for example: memclnt)
return s.ReplyType != "" && s.ReplyType != "null" // not null
}
func getSizeOfType(typ *Type) (size int) {
for _, field := range typ.Fields {
if n := getBinapiTypeSize(field.Type); n > 0 {
if field.Length > 0 {
size += n * field.Length
} else {
size += n
}
}
}
return size
}
|