The goal of this series is to make QAPI ready to handle mostly unions in a less verbose way so that a future -blockdev command line option can be a direct mapping of the structure used by a blockdev-add QMP command. This series implements everything that I think is needed for this on the QAPI side. The block layer side is still lacking, but good enough that I could actually add a block device using the new command; the problem is here mostly that many -drive options aren't supported yet.
To give you an idea of what the interface looks like in the end, this is what you can pass now in theory (the block layer just won't like the read-only option and error out...): { "execute": "blockdev-add", "arguments": { "options": { "driver": "qcow2", "read-only": true, "lazy-refcounts": true, "file": { "driver": "file", "read-only": false, "filename": "/home/kwolf/images/hd.img" } } } } Kevin Wolf (11): qapi-types.py: Split off generate_struct_fields() qapi-types.py: Implement 'base' for unions qapi-visit.py: Split off generate_visit_struct_fields() qapi-visit.py: Implement 'base' for unions qapi: Add visitor for implicit structs qapi: Flat unions with arbitrary discriminator qapi: Add consume argument to qmp_input_get_object() qapi: Anonymous unions Implement qdict_flatten() block: Allow "driver" option on the top level [WIP] block: Implement 'blockdev-add' QMP command block.c | 7 ++ blockdev.c | 52 ++++++++++--- include/qapi/qmp/qdict.h | 1 + include/qapi/qmp/qobject.h | 1 + include/qapi/visitor-impl.h | 6 ++ include/qapi/visitor.h | 6 ++ qapi-schema.json | 29 +++++++ qapi/qapi-visit-core.c | 25 +++++++ qapi/qmp-input-visitor.c | 47 +++++++++--- qmp-commands.hx | 6 ++ qobject/qdict.c | 47 ++++++++++++ qobject/qjson.c | 2 + scripts/qapi-types.py | 83 ++++++++++++++++++-- scripts/qapi-visit.py | 179 ++++++++++++++++++++++++++++++++++++-------- scripts/qapi.py | 28 +++++++ 15 files changed, 459 insertions(+), 60 deletions(-) -- 1.8.1.4