]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: qapi: Use declarative approach for meta-type parsers in virQEMUQAPISchemaTraverse
authorPeter Krempa <pkrempa@redhat.com>
Wed, 10 Apr 2019 12:22:14 +0000 (14:22 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 May 2019 07:46:06 +0000 (09:46 +0200)
Introduce an array of callbacks for given 'meta-type' of the QAPI schema
structure rather than using code to select it. This will simplify
extension for the other meta-types which are not handled yet.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_qapi.c

index a03aab7f9bccda6658b4aa79bb62ae32318b0e03..9a5becb26ff682dce6c16834c24761b5ca14efc6 100644 (file)
@@ -164,12 +164,30 @@ virQEMUQAPISchemaTraverseCommand(virJSONValuePtr cur,
 }
 
 
+typedef int (*virQEMUQAPISchemaTraverseFunc)(virJSONValuePtr cur,
+                                             struct virQEMUQAPISchemaTraverseContext *ctxt);
+
+struct virQEMUQAPISchemaTraverseMetaType {
+    const char *metatype;
+    virQEMUQAPISchemaTraverseFunc func;
+};
+
+
+static const struct virQEMUQAPISchemaTraverseMetaType traverseMetaType[] = {
+    { "object", virQEMUQAPISchemaTraverseObject },
+    { "array", virQEMUQAPISchemaTraverseArray },
+    { "command", virQEMUQAPISchemaTraverseCommand },
+    { "event", virQEMUQAPISchemaTraverseCommand },
+};
+
+
 static int
 virQEMUQAPISchemaTraverse(const char *baseName,
                           struct virQEMUQAPISchemaTraverseContext *ctxt)
 {
     virJSONValuePtr cur;
     const char *metatype;
+    size_t i;
 
     if (!(cur = virHashLookup(ctxt->schema, baseName)))
         return 0;
@@ -182,16 +200,9 @@ virQEMUQAPISchemaTraverse(const char *baseName,
     if (!(metatype = virJSONValueObjectGetString(cur, "meta-type")))
         return 0;
 
-    if (STREQ(metatype, "array")) {
-        return virQEMUQAPISchemaTraverseArray(cur, ctxt);
-    } else if (STREQ(metatype, "object")) {
-        return virQEMUQAPISchemaTraverseObject(cur, ctxt);
-    } else if (STREQ(metatype, "command") ||
-               STREQ(metatype, "event")) {
-        return virQEMUQAPISchemaTraverseCommand(cur, ctxt);
-    } else {
-        /* alternates, basic types and enums can't be entered */
-        return 0;
+    for (i = 0; i < ARRAY_CARDINALITY(traverseMetaType); i++) {
+        if (STREQ(metatype, traverseMetaType[i].metatype))
+            return traverseMetaType[i].func(cur, ctxt);
     }
 
     return 0;