Optimize socketclient adapter and add various code improvements
[govpp.git] / cmd / binapi-generator / objects.go
index 97318cb..9871abc 100644 (file)
@@ -1,41 +1,46 @@
 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
@@ -45,8 +50,8 @@ type Alias struct {
        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
@@ -54,62 +59,81 @@ type Union struct {
 
 // 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
 }