docs: Document QAPI union types

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
Kevin Wolf 2013-07-16 13:17:27 +02:00
parent 0aef92b90d
commit 51631493e4

View File

@ -34,9 +34,15 @@ OrderedDicts so that ordering is preserved.
There are two basic syntaxes used, type definitions and command definitions. There are two basic syntaxes used, type definitions and command definitions.
The first syntax defines a type and is represented by a dictionary. There are The first syntax defines a type and is represented by a dictionary. There are
two kinds of types that are supported: complex user-defined types, and enums. three kinds of user-defined types that are supported: complex types,
enumeration types and union types.
A complex type is a dictionary containing a single key who's value is a Generally speaking, types definitions should always use CamelCase for the type
names. Command names should be all lower case with words separated by a hyphen.
=== Complex types ===
A complex type is a dictionary containing a single key whose value is a
dictionary. This corresponds to a struct in C or an Object in JSON. An dictionary. This corresponds to a struct in C or an Object in JSON. An
example of a complex type is: example of a complex type is:
@ -47,13 +53,57 @@ The use of '*' as a prefix to the name means the member is optional. Optional
members should always be added to the end of the dictionary to preserve members should always be added to the end of the dictionary to preserve
backwards compatibility. backwards compatibility.
An enumeration type is a dictionary containing a single key who's value is a === Enumeration types ===
An enumeration type is a dictionary containing a single key whose value is a
list of strings. An example enumeration is: list of strings. An example enumeration is:
{ 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] } { 'enum': 'MyEnum', 'data': [ 'value1', 'value2', 'value3' ] }
Generally speaking, complex types and enums should always use CamelCase for === Union types ===
the type names.
Union types are used to let the user choose between several different data
types. A union type is defined using a dictionary as explained in the
following paragraphs.
A simple union type defines a mapping from discriminator values to data types
like in this example:
{ 'type': 'FileOptions', 'data': { 'filename': 'str' } }
{ 'type': 'Qcow2Options',
'data': { 'backing-file': 'str', 'lazy-refcounts': 'bool' } }
{ 'union': 'BlockdevOptions',
'data': { 'file': 'FileOptions',
'qcow2': 'Qcow2Options' } }
In the QMP wire format, a simple union is represented by a dictionary that
contains the 'type' field as a discriminator, and a 'data' field that is of the
specified data type corresponding to the discriminator value:
{ "type": "qcow2", "data" : { "backing-file": "/some/place/my-image",
"lazy-refcounts": true } }
A union definition can specify a complex type as its base. In this case, the
fields of the complex type are included as top-level fields of the union
dictionary in the QMP wire format. An example definition is:
{ 'type': 'BlockdevCommonOptions', 'data': { 'readonly': 'bool' } }
{ 'union': 'BlockdevOptions',
'base': 'BlockdevCommonOptions',
'data': { 'raw': 'RawOptions',
'qcow2': 'Qcow2Options' } }
And it looks like this on the wire:
{ "type": "qcow2",
"readonly": false,
"data" : { "backing-file": "/some/place/my-image",
"lazy-refcounts": true } }
=== Commands ===
Commands are defined by using a list containing three members. The first Commands are defined by using a list containing three members. The first
member is the command name, the second member is a dictionary containing member is the command name, the second member is a dictionary containing
@ -65,8 +115,6 @@ An example command is:
'data': { 'arg1': 'str', '*arg2': 'str' }, 'data': { 'arg1': 'str', '*arg2': 'str' },
'returns': 'str' } 'returns': 'str' }
Command names should be all lower case with words separated by a hyphen.
== Code generation == == Code generation ==