aboutsummaryrefslogtreecommitdiffstats
path: root/binapigen/vppapi/parse_json.go
diff options
context:
space:
mode:
Diffstat (limited to 'binapigen/vppapi/parse_json.go')
-rw-r--r--binapigen/vppapi/parse_json.go48
1 files changed, 42 insertions, 6 deletions
diff --git a/binapigen/vppapi/parse_json.go b/binapigen/vppapi/parse_json.go
index d14865c..ed7bcad 100644
--- a/binapigen/vppapi/parse_json.go
+++ b/binapigen/vppapi/parse_json.go
@@ -41,14 +41,16 @@ const (
fileMessages = "messages"
fileUnions = "unions"
fileEnums = "enums"
+ fileEnumflags = "enumflags"
fileAliases = "aliases"
fileServices = "services"
fileImports = "imports"
// type keys
- messageCrc = "crc"
- enumType = "enumtype"
- aliasLength = "length"
- aliasType = "type"
+ messageCrc = "crc"
+ messageOptions = "options"
+ enumType = "enumtype"
+ aliasLength = "length"
+ aliasType = "type"
// service
serviceReply = "reply"
serviceStream = "stream"
@@ -129,6 +131,20 @@ func parseJSON(data []byte) (module *File, err error) {
module.EnumTypes = append(module.EnumTypes, *enum)
}
+ // parse enumflags types
+ enumflagsNode := jsonRoot.Map(fileEnumflags)
+ module.EnumflagTypes = make([]EnumType, 0)
+ for i := 0; i < enumflagsNode.Len(); i++ {
+ enumflag, err := parseEnum(enumflagsNode.At(i))
+ if err != nil {
+ return nil, err
+ }
+ if exists(enumflag.Name) {
+ continue
+ }
+ module.EnumflagTypes = append(module.EnumflagTypes, *enumflag)
+ }
+
// parse alias types
aliasesNode := jsonRoot.Map(fileAliases)
if aliasesNode.GetType() == jsongo.TypeMap {
@@ -360,10 +376,30 @@ func parseMessage(msgNode *jsongo.Node) (*Message, error) {
if !ok {
return nil, fmt.Errorf("message crc invalid or missing")
}
+ var msgOpts map[string]string
+ msgOptsNode := msgNode.At(msgNode.Len() - 1).Map(messageOptions)
+ if msgOptsNode.GetType() == jsongo.TypeMap {
+ msgOpts = make(map[string]string)
+ for _, opt := range msgOptsNode.GetKeys() {
+ if _, ok := opt.(string); !ok {
+ logf("invalid message option key, expected string")
+ continue
+ }
+ msgOpts[opt.(string)] = ""
+ if msgOptsNode.At(opt).Get() != nil {
+ if optMsgStr, ok := msgOptsNode.At(opt).Get().(string); ok {
+ msgOpts[opt.(string)] = optMsgStr
+ } else {
+ logf("invalid message option value, expected string")
+ }
+ }
+ }
+ }
msg := Message{
- Name: msgName,
- CRC: msgCRC,
+ Name: msgName,
+ CRC: msgCRC,
+ Options: msgOpts,
}
// loop through message fields, skip first (name) and last (crc)