aboutsummaryrefslogtreecommitdiffstats
path: root/cmd/binapi-generator/objects.go
diff options
context:
space:
mode:
Diffstat (limited to 'cmd/binapi-generator/objects.go')
-rw-r--r--cmd/binapi-generator/objects.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/cmd/binapi-generator/objects.go b/cmd/binapi-generator/objects.go
new file mode 100644
index 0000000..2681085
--- /dev/null
+++ b/cmd/binapi-generator/objects.go
@@ -0,0 +1,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
+}