]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: qapi: Implement worker for introspecting builtin types
authorPeter Krempa <pkrempa@redhat.com>
Thu, 11 Apr 2019 12:54:41 +0000 (14:54 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 6 May 2019 07:46:06 +0000 (09:46 +0200)
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_qapi.c
tests/qemumonitorjsontest.c

index 8a695e022da12b9476d2d3cb45c231e11c410c07..d401e9a303fc1ca69fd787f4354205b304b1567b 100644 (file)
@@ -121,7 +121,7 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
         query++;
 
     /* exit on modifers for other types */
-    if (modifier == '^')
+    if (modifier == '^' || modifier == '!')
         return 0;
 
     if (modifier == '+') {
@@ -203,6 +203,31 @@ virQEMUQAPISchemaTraverseEnum(virJSONValuePtr cur,
 }
 
 
+static int
+virQEMUQAPISchemaTraverseBuiltin(virJSONValuePtr cur,
+                                 struct virQEMUQAPISchemaTraverseContext *ctxt)
+{
+    const char *query = virQEMUQAPISchemaTraverseContextNextQuery(ctxt);
+    const char *jsontype;
+
+    if (query[0] != '!')
+        return 0;
+
+    if (virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt))
+        return -3;
+
+    query++;
+
+    if (!(jsontype = virJSONValueObjectGetString(cur, "json-type")))
+        return -1;
+
+    if (STREQ(jsontype, query))
+        return 1;
+
+    return 0;
+}
+
+
 /* The function must return 1 on successful query, 0 if the query was not found
  * -1 when a libvirt error is reported, -2 if the schema is invalid and -3 if
  *  the query component is malformed. */
@@ -221,6 +246,7 @@ static const struct virQEMUQAPISchemaTraverseMetaType traverseMetaType[] = {
     { "command", virQEMUQAPISchemaTraverseCommand },
     { "event", virQEMUQAPISchemaTraverseCommand },
     { "enum", virQEMUQAPISchemaTraverseEnum },
+    { "builtin", virQEMUQAPISchemaTraverseBuiltin },
 };
 
 
@@ -280,6 +306,9 @@ virQEMUQAPISchemaTraverse(const char *baseName,
  *
  * - Boolean queries - @entry remains NULL, return value indicates success:
  *   '^enumval': returns true if the previously selected enum contains 'enumval'
+ *   '!basictype': returns true if previously selected type is of 'basictype'
+ *                 JSON type. Spported are 'null', 'string', 'number', 'value',
+ *                 'int' and 'boolean.
  *
  * If the name of any (sub)attribute starts with non-alphabetical symbols it
  * needs to be prefixed by a single space.
index 94790cdbfe7bf8cc9e79971c6be0d7399e07baa8..aebde20a5fd587aab2e1fd5fd3e0d6266699126c 100644 (file)
@@ -3092,12 +3092,14 @@ mymain(void)
     DO_TEST_QAPI_QUERY("variant", "blockdev-add/arg-type/+file", 1, true);
     DO_TEST_QAPI_QUERY("variant property", "blockdev-add/arg-type/+file/filename", 1, true);
     DO_TEST_QAPI_QUERY("enum value", "query-status/ret-type/status/^debug", 1, false);
+    DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!string", 1, false);
 
     DO_TEST_QAPI_QUERY("nonexistent command", "nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent attr", "screendump/arg-type/nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent variant", "blockdev-add/arg-type/+nonexistent", 0, false);
     DO_TEST_QAPI_QUERY("nonexistent enum value", "query-status/ret-type/status/^nonexistentdebug", 0, false);
     DO_TEST_QAPI_QUERY("broken query for enum value", "query-status/ret-type/status/^debug/test", -1, false);
+    DO_TEST_QAPI_QUERY("builtin type", "query-qmp-schema/ret-type/name/!number", 0, false);
 
 #undef DO_TEST_QAPI_QUERY