api: use string type for strings in memclnt.api
[vpp.git] / src / vpp-api / vapi / vapi_json_parser.py
index a9d2c81..d0f8de0 100644 (file)
@@ -167,48 +167,9 @@ class Message(object):
             else:
                 field_type = json_parser.lookup_type_like_id(field[0])
                 logger.debug("Parsing message field `%s'" % field)
-                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)
+                f = parse_field(field_class, fields, field, field_type)
+                logger.debug("Parsed field `%s'" % f)
+                fields.append(f)
         self.fields = fields
         self.depends = [f.type for f in self.fields]
         logger.debug("Parsed message: %s" % self)
@@ -220,6 +181,48 @@ 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):
@@ -233,36 +236,8 @@ class StructType (Type, Struct):
                 continue
             field_type = json_parser.lookup_type_like_id(field[0])
             logger.debug("Parsing type field `%s'" % field)
-            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)
+            f = parse_field(field_class, fields, field, field_type)
+            fields.append(f)
         Type.__init__(self, name)
         Struct.__init__(self, name, fields)