aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp-api/vapi/vapi_json_parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/vpp-api/vapi/vapi_json_parser.py')
-rw-r--r--src/vpp-api/vapi/vapi_json_parser.py119
1 files changed, 72 insertions, 47 deletions
diff --git a/src/vpp-api/vapi/vapi_json_parser.py b/src/vpp-api/vapi/vapi_json_parser.py
index d0f8de03617..a9d2c8186bc 100644
--- a/src/vpp-api/vapi/vapi_json_parser.py
+++ b/src/vpp-api/vapi/vapi_json_parser.py
@@ -167,9 +167,48 @@ class Message(object):
else:
field_type = json_parser.lookup_type_like_id(field[0])
logger.debug("Parsing message field `%s'" % field)
- f = parse_field(field_class, fields, field, field_type)
- logger.debug("Parsed field `%s'" % f)
- fields.append(f)
+ l = len(field)
+ if any(type(n) is dict for n in field):
+ l -= 1
+ if l == 2:
+ if self.header is not None and\
+ self.header.has_field(field[1]):
+ continue
+ p = field_class(field_name=field[1],
+ field_type=field_type)
+ elif l == 3:
+ if field[2] == 0:
+ raise ParseError(
+ "While parsing message `%s': variable length "
+ "array `%s' doesn't have reference to member "
+ "containing the actual length" % (
+ name, field[1]))
+ p = field_class(
+ field_name=field[1],
+ field_type=field_type,
+ array_len=field[2])
+ elif l == 4:
+ nelem_field = None
+ for f in fields:
+ if f.name == field[3]:
+ nelem_field = f
+ if nelem_field is None:
+ raise ParseError(
+ "While parsing message `%s': couldn't find "
+ "variable length array `%s' member containing "
+ "the actual length `%s'" % (
+ name, field[1], field[3]))
+ p = field_class(
+ field_name=field[1],
+ field_type=field_type,
+ array_len=field[2],
+ nelem_field=nelem_field)
+ else:
+ raise Exception("Don't know how to parse message "
+ "definition for message `%s': `%s'" %
+ (m, m[1:]))
+ logger.debug("Parsed field `%s'" % p)
+ fields.append(p)
self.fields = fields
self.depends = [f.type for f in self.fields]
logger.debug("Parsed message: %s" % self)
@@ -181,48 +220,6 @@ class Message(object):
self.crc)
-def parse_field(field_class, fields, field, field_type):
- l = len(field)
- if l > 2:
- if type(field[2]) is dict:
- if "limit" in field[2]:
- array_len = field[2]["limit"]
- else:
- l -= 1
- else:
- array_len = field[2]
-
- if l == 2:
- return field_class(field_name=field[1],
- field_type=field_type)
- elif l == 3:
- if field[2] == 0:
- raise ParseError("While parsing type `%s': array `%s' has "
- "variable length" % (name, field[1]))
- return field_class(field_name=field[1],
- field_type=field_type,
- array_len=array_len)
- elif l == 4:
- nelem_field = None
- for f in fields:
- if f.name == field[3]:
- nelem_field = f
- if nelem_field is None:
- raise ParseError(
- "While parsing message `%s': couldn't find "
- "variable length array `%s' member containing "
- "the actual length `%s'" % (
- name, field[1], field[3]))
- return field_class(field_name=field[1],
- field_type=field_type,
- array_len=array_len,
- nelem_field=nelem_field)
- else:
- raise ParseError(
- "Don't know how to parse field `%s' of type definition "
- "for type `%s'" % (field, t))
-
-
class StructType (Type, Struct):
def __init__(self, definition, json_parser, field_class, logger):
@@ -236,8 +233,36 @@ class StructType (Type, Struct):
continue
field_type = json_parser.lookup_type_like_id(field[0])
logger.debug("Parsing type field `%s'" % field)
- f = parse_field(field_class, fields, field, field_type)
- fields.append(f)
+ if len(field) == 2:
+ p = field_class(field_name=field[1],
+ field_type=field_type)
+ elif len(field) == 3:
+ if field[2] == 0:
+ raise ParseError("While parsing type `%s': array `%s' has "
+ "variable length" % (name, field[1]))
+ p = field_class(field_name=field[1],
+ field_type=field_type,
+ array_len=field[2])
+ elif len(field) == 4:
+ nelem_field = None
+ for f in fields:
+ if f.name == field[3]:
+ nelem_field = f
+ if nelem_field is None:
+ raise ParseError(
+ "While parsing message `%s': couldn't find "
+ "variable length array `%s' member containing "
+ "the actual length `%s'" % (
+ name, field[1], field[3]))
+ p = field_class(field_name=field[1],
+ field_type=field_type,
+ array_len=field[2],
+ nelem_field=nelem_field)
+ else:
+ raise ParseError(
+ "Don't know how to parse field `%s' of type definition "
+ "for type `%s'" % (field, t))
+ fields.append(p)
Type.__init__(self, name)
Struct.__init__(self, name, fields)