提交 8bfb615b 编写于 作者: P Peter Krempa

qemu: qapi: Implement worker for introspecting enums

Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 0ea6cd62
...@@ -120,6 +120,10 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur, ...@@ -120,6 +120,10 @@ virQEMUQAPISchemaTraverseObject(virJSONValuePtr cur,
if (!c_isalpha(modifier)) if (!c_isalpha(modifier))
query++; query++;
/* exit on modifers for other types */
if (modifier == '^')
return 0;
if (modifier == '+') { if (modifier == '+') {
obj = virQEMUQAPISchemaObjectGet("variants", query, "case", cur); obj = virQEMUQAPISchemaObjectGet("variants", query, "case", cur);
} else { } else {
...@@ -164,6 +168,41 @@ virQEMUQAPISchemaTraverseCommand(virJSONValuePtr cur, ...@@ -164,6 +168,41 @@ virQEMUQAPISchemaTraverseCommand(virJSONValuePtr cur,
return virQEMUQAPISchemaTraverse(querytype, ctxt); return virQEMUQAPISchemaTraverse(querytype, ctxt);
} }
static int
virQEMUQAPISchemaTraverseEnum(virJSONValuePtr cur,
struct virQEMUQAPISchemaTraverseContext *ctxt)
{
const char *query = virQEMUQAPISchemaTraverseContextNextQuery(ctxt);
virJSONValuePtr values;
virJSONValuePtr enumval;
const char *value;
size_t i;
if (query[0] != '^')
return 0;
if (virQEMUQAPISchemaTraverseContextHasNextQuery(ctxt))
return -3;
query++;
if (!(values = virJSONValueObjectGetArray(cur, "values")))
return -2;
for (i = 0; i < virJSONValueArraySize(values); i++) {
if (!(enumval = virJSONValueArrayGet(values, i)) ||
!(value = virJSONValueGetString(enumval)))
continue;
if (STREQ(value, query))
return 1;
}
return 0;
}
/* The function must return 1 on successful query, 0 if the query was not found /* 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 * -1 when a libvirt error is reported, -2 if the schema is invalid and -3 if
* the query component is malformed. */ * the query component is malformed. */
...@@ -181,6 +220,7 @@ static const struct virQEMUQAPISchemaTraverseMetaType traverseMetaType[] = { ...@@ -181,6 +220,7 @@ static const struct virQEMUQAPISchemaTraverseMetaType traverseMetaType[] = {
{ "array", virQEMUQAPISchemaTraverseArray }, { "array", virQEMUQAPISchemaTraverseArray },
{ "command", virQEMUQAPISchemaTraverseCommand }, { "command", virQEMUQAPISchemaTraverseCommand },
{ "event", virQEMUQAPISchemaTraverseCommand }, { "event", virQEMUQAPISchemaTraverseCommand },
{ "enum", virQEMUQAPISchemaTraverseEnum },
}; };
...@@ -239,7 +279,7 @@ virQEMUQAPISchemaTraverse(const char *baseName, ...@@ -239,7 +279,7 @@ virQEMUQAPISchemaTraverse(const char *baseName,
* the prevously selected member * the prevously selected member
* *
* - Boolean queries - @entry remains NULL, return value indicates success: * - Boolean queries - @entry remains NULL, return value indicates success:
* (none) * '^enumval': returns true if the previously selected enum contains 'enumval'
* *
* If the name of any (sub)attribute starts with non-alphabetical symbols it * If the name of any (sub)attribute starts with non-alphabetical symbols it
* needs to be prefixed by a single space. * needs to be prefixed by a single space.
......
...@@ -3091,10 +3091,13 @@ mymain(void) ...@@ -3091,10 +3091,13 @@ mymain(void)
DO_TEST_QAPI_QUERY("optional property", "block-commit/arg-type/*top", 1, true); DO_TEST_QAPI_QUERY("optional property", "block-commit/arg-type/*top", 1, true);
DO_TEST_QAPI_QUERY("variant", "blockdev-add/arg-type/+file", 1, true); 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("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("nonexistent command", "nonexistent", 0, 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 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 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);
#undef DO_TEST_QAPI_QUERY #undef DO_TEST_QAPI_QUERY
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册