package main
-import "strings"
+import "fmt"
// Package represents collection of objects parsed from VPP binary API JSON data
type Package struct {
- APIVersion string
- Enums []Enum
- Unions []Union
- Types []Type
- Aliases []Alias
- Messages []Message
- Services []Service
- RefMap map[string]string
+ Name string
+ Version string
+ CRC string
+ Services []Service
+ Enums []Enum
+ Aliases []Alias
+ Types []Type
+ Unions []Union
+ Messages []Message
+ RefMap map[string]string
+ Imports map[string]Import
}
-// MessageType represents the type of a VPP message
-type MessageType int
+type Import struct {
+ Package string
+}
-const (
- requestMessage MessageType = iota // VPP request message
- replyMessage // VPP reply message
- eventMessage // VPP event message
- otherMessage // other VPP message
-)
+// Service represents VPP binary API service
+type Service struct {
+ Name string
+ RequestType string
+ ReplyType string
+ Stream bool
+ Events []string
+}
-// Message represents VPP binary API message
-type Message struct {
- Name string
- CRC string
- Fields []Field
+// Enum represents VPP binary API enum
+type Enum struct {
+ Name string
+ Type string
+ Entries []EnumEntry
}
-// Type represents VPP binary API type
-type Type struct {
- Name string
- CRC string
- Fields []Field
+// EnumEntry represents VPP binary API enum entry
+type EnumEntry struct {
+ Name string
+ Value interface{}
}
// Alias represents VPP binary API alias
Length int
}
-// Union represents VPP binary API union
-type Union struct {
+// Type represents VPP binary API type
+type Type 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
+ Name string
+ Type string
+ Length int
+ SpecifiedLen bool
+ SizeFrom string
+ Meta FieldMeta
}
-func (f *Field) IsArray() bool {
- return f.Length > 0 || f.SizeFrom != ""
+// FieldMeta represents VPP binary API meta info for field
+type FieldMeta struct {
+ Limit int
+ Default string
}
-// Enum represents VPP binary API enum
-type Enum struct {
- Name string
- Type string
- Entries []EnumEntry
+// Union represents VPP binary API union
+type Union struct {
+ Name string
+ CRC string
+ Fields []Field
}
-// EnumEntry represents VPP binary API enum entry
-type EnumEntry struct {
- Name string
- Value interface{}
+// Message represents VPP binary API message
+type Message struct {
+ Name string
+ CRC string
+ Fields []Field
}
-// Service represents VPP binary API service
-type Service struct {
- Name string
- RequestType string
- ReplyType string
- Stream bool
- Events []string
-}
+// MessageType represents the type of a VPP message
+type MessageType int
-func (s Service) MethodName() string {
- reqTyp := camelCaseName(s.RequestType)
+const (
+ requestMessage MessageType = iota // VPP request message
+ replyMessage // VPP reply message
+ eventMessage // VPP event message
+ otherMessage // other VPP message
+)
- // 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
+// printPackage prints all loaded objects for package
+func printPackage(pkg *Package) {
+ logf("package: %s %s (%s)", pkg.Name, pkg.Version, pkg.CRC)
+ if len(pkg.Enums) > 0 {
+ logf(" %d enums:", len(pkg.Enums))
+ for _, enum := range pkg.Enums {
+ logf(" - %s: %+v", enum.Name, enum)
+ }
+ }
+ if len(pkg.Unions) > 0 {
+ logf(" %d unions:", len(pkg.Unions))
+ for _, union := range pkg.Unions {
+ logf(" - %s: %+v", union.Name, union)
+ }
+ }
+ if len(pkg.Types) > 0 {
+ logf(" %d types:", len(pkg.Types))
+ for _, typ := range pkg.Types {
+ logf(" - %s (%d fields): %+v", typ.Name, len(typ.Fields), typ)
+ }
+ }
+ if len(pkg.Messages) > 0 {
+ logf(" %d messages:", len(pkg.Messages))
+ for _, msg := range pkg.Messages {
+ logf(" - %s (%d fields) %s", msg.Name, len(msg.Fields), msg.CRC)
+ }
+ }
+ if len(pkg.Services) > 0 {
+ logf(" %d services:", len(pkg.Services))
+ for _, svc := range pkg.Services {
+ var info string
+ if svc.Stream {
+ info = "(STREAM)"
+ } else if len(svc.Events) > 0 {
+ info = fmt.Sprintf("(EVENTS: %v)", svc.Events)
+ }
+ logf(" - %s: %q -> %q %s", svc.Name, svc.RequestType, svc.ReplyType, info)
}
}
-
- 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
}