aboutsummaryrefslogtreecommitdiffstats
path: root/src/vpp-api/vapi/vapi_json_parser.py
diff options
context:
space:
mode:
authorOle Troan <ot@cisco.com>2019-08-27 15:05:27 +0200
committerOle Trøan <otroan@employees.org>2019-08-27 18:04:00 +0000
commit7adaa226eaa2401d6bb0dfd38a0d943c9645d7dc (patch)
tree78ffbde9837497a25971464dcd020f77da6e0ca9 /src/vpp-api/vapi/vapi_json_parser.py
parent2cdcd0cf4004b2c0d1d3b891e381aac5735c21f1 (diff)
api: revert use string type for strings in memclnt.api
This reverts commit 2959d42feb576c0e00c28c4e27658b25f6c783e9. Lacks client side fixes. Type: fix Change-Id: Ib94b18e74325cede41ed1733e57896f17a952526 Signed-off-by: Ole Troan <ot@cisco.com>
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)