summaryrefslogtreecommitdiffstats
path: root/cmd/binapi-generator/objects.go
blob: 9325d03558ad8c3e6704bdd9c0d875f97e13cdf9 (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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package main

import "fmt"

// Package represents collection of objects parsed from VPP binary API JSON data
type Package struct {
	Name     string
	Version  string
	CRC      string
	Services []Service
	Enums    []Enum
	Aliases  []Alias
	Types    []Type
	Unions   []Union
	Messages []Message
	RefMap   map[string]string
}

// Service represents VPP binary API service
type Service struct {
	Name        string
	RequestType string
	ReplyType   string
	Stream      bool
	Events      []string
}

// 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{}
}

// Alias represents VPP binary API alias
type Alias struct {
	Name   string
	Type   string
	Length int
}

// 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
	SpecifiedLen bool
	SizeFrom     string
	Meta         FieldMeta
}

// FieldMeta represents VPP binary API meta info for field
type FieldMeta struct {
	Limit   int
	Default string
}

// Union represents VPP binary API union
type Union struct {
	Name   string
	CRC    string
	Fields []Field
}

// Message represents VPP binary API message
type Message struct {
	Name   string
	CRC    string
	Fields []Field
}

// 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
)

// 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)
		}
	}
}