qemu: qapi: Allow selecting specifically optional schema entries in virQEMUQAPISchemaTraverse

Add a new modifier character '*' which will select given schema entry
only when it is optional (denoted by the presence of the 'default' key).

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
This commit is contained in:
Peter Krempa 2018-08-15 08:51:01 +02:00
parent c59734e3f6
commit 139ee1f192

View File

@ -107,6 +107,7 @@ virQEMUQAPISchemaTraverse(const char *baseName,
virHashTablePtr schema)
{
virJSONValuePtr base;
virJSONValuePtr obj;
const char *metatype;
const char *querystr;
char modifier;
@ -134,15 +135,21 @@ virQEMUQAPISchemaTraverse(const char *baseName,
if (!c_isalpha(modifier))
querystr++;
if (modifier == '+')
if (modifier == '+') {
baseName = virQEMUQAPISchemaObjectGetType("variants",
querystr,
"case", base);
else
baseName = virQEMUQAPISchemaObjectGetType("members",
querystr,
} else {
obj = virQEMUQAPISchemaObjectGet("members", querystr,
"name", base);
if (modifier == '*' &&
!virJSONValueObjectHasKey(obj, "default"))
return NULL;
baseName = virQEMUQAPISchemaTypeFromObject(obj);
}
if (!baseName)
return NULL;
} else if (STREQ(metatype, "command") ||
@ -177,6 +184,8 @@ virQEMUQAPISchemaTraverse(const char *baseName,
* attribute: selects whether arguments or return type should be introspected
* ("arg-type" or "ret-type" for commands, "arg-type" for events)
* subattribute: specifies member name of object types
* *subattribute: same as above but must be optional (has a property named
* 'default' field in the schema)
* +variant_discriminator: In the case of unionized objects, select a
* specific case to introspect.
*