query++;
/* exit on modifers for other types */
- if (modifier == '^')
+ if (modifier == '^' || modifier == '!')
return 0;
if (modifier == '+') {
}
+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. */
{ "command", virQEMUQAPISchemaTraverseCommand },
{ "event", virQEMUQAPISchemaTraverseCommand },
{ "enum", virQEMUQAPISchemaTraverseEnum },
+ { "builtin", virQEMUQAPISchemaTraverseBuiltin },
};
*
* - 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.
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