mirror of
https://github.com/qemu/qemu.git
synced 2024-11-24 19:33:39 +08:00
qapi: Document 'struct' metatype
Referring to "type" as both a meta-type (built-in, enum, union, alternate, or struct) and a specific type (the name that the schema uses for declaring structs) is confusing. Now that the generator accepts 'struct' as a synonym for 'type', update all documentation to use saner wording. Signed-off-by: Eric Blake <eblake@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
parent
fd41dd4eae
commit
3b2a8b8532
@ -72,7 +72,7 @@ x.y.z)' comment. For example:
|
||||
#
|
||||
# Since: 0.14.0
|
||||
##
|
||||
{ 'type': 'BlockStats',
|
||||
{ 'struct': 'BlockStats',
|
||||
'data': {'*device': 'str', 'stats': 'BlockDeviceStats',
|
||||
'*parent': 'BlockStats',
|
||||
'*backing': 'BlockStats'} }
|
||||
@ -86,7 +86,7 @@ types, and allows for indefinite nesting of QMP that satisfies the
|
||||
schema. A type name should not be defined more than once.
|
||||
|
||||
There are seven top-level expressions recognized by the parser:
|
||||
'include', 'command', 'type', 'enum', 'union', 'alternate', and
|
||||
'include', 'command', 'struct', 'enum', 'union', 'alternate', and
|
||||
'event'. There are several groups of types: simple types (a number of
|
||||
built-in types, such as 'int' and 'str'; as well as enumerations),
|
||||
complex types (structs and two flavors of unions), and alternate types
|
||||
@ -128,9 +128,9 @@ In the rest of this document, usage lines are given for each
|
||||
expression type, with literal strings written in lower case and
|
||||
placeholders written in capitals. If a literal string includes a
|
||||
prefix of '*', that key/value pair can be omitted from the expression.
|
||||
For example, a usage statement that includes '*base':COMPLEX-TYPE-NAME
|
||||
For example, a usage statement that includes '*base':STRUCT-NAME
|
||||
means that an expression has an optional key 'base', which if present
|
||||
must have a value that forms a complex type name.
|
||||
must have a value that forms a struct name.
|
||||
|
||||
|
||||
=== Built-in Types ===
|
||||
@ -168,17 +168,17 @@ an outer file. The parser may be made stricter in the future to
|
||||
prevent incomplete include files.
|
||||
|
||||
|
||||
=== Complex types ===
|
||||
=== Struct types ===
|
||||
|
||||
Usage: { 'type': STRING, 'data': DICT, '*base': COMPLEX-TYPE-NAME }
|
||||
Usage: { 'struct': STRING, 'data': DICT, '*base': STRUCT-NAME }
|
||||
|
||||
A complex type is a dictionary containing a single 'data' key whose
|
||||
A struct is a dictionary containing a single 'data' key whose
|
||||
value is a dictionary. This corresponds to a struct in C or an Object
|
||||
in JSON. Each value of the 'data' dictionary must be the name of a
|
||||
type, or a one-element array containing a type name. An example of a
|
||||
complex type is:
|
||||
struct is:
|
||||
|
||||
{ 'type': 'MyType',
|
||||
{ 'struct': 'MyType',
|
||||
'data': { 'member1': 'str', 'member2': 'int', '*member3': 'str' } }
|
||||
|
||||
The use of '*' as a prefix to the name means the member is optional in
|
||||
@ -211,13 +211,13 @@ A structure that is used in both input and output of various commands
|
||||
must consider the backwards compatibility constraints of both directions
|
||||
of use.
|
||||
|
||||
A complex type definition can specify another complex type as its base.
|
||||
A struct definition can specify another struct as its base.
|
||||
In this case, the fields of the base type are included as top-level fields
|
||||
of the new complex type's dictionary in the QMP wire format. An example
|
||||
of the new struct's dictionary in the QMP wire format. An example
|
||||
definition is:
|
||||
|
||||
{ 'type': 'BlockdevOptionsGenericFormat', 'data': { 'file': 'str' } }
|
||||
{ 'type': 'BlockdevOptionsGenericCOWFormat',
|
||||
{ 'struct': 'BlockdevOptionsGenericFormat', 'data': { 'file': 'str' } }
|
||||
{ 'struct': 'BlockdevOptionsGenericCOWFormat',
|
||||
'base': 'BlockdevOptionsGenericFormat',
|
||||
'data': { '*backing': 'str' } }
|
||||
|
||||
@ -252,7 +252,7 @@ converting between strings and enum values. Since the wire format
|
||||
always passes by name, it is acceptable to reorder or add new
|
||||
enumeration members in any location without breaking QMP clients;
|
||||
however, removing enum values would break compatibility. For any
|
||||
complex type that has a field that will only contain a finite set of
|
||||
struct that has a field that will only contain a finite set of
|
||||
string values, using an enum type for that field is better than
|
||||
open-coding the field to be type 'str'.
|
||||
|
||||
@ -260,7 +260,7 @@ open-coding the field to be type 'str'.
|
||||
=== Union types ===
|
||||
|
||||
Usage: { 'union': STRING, 'data': DICT }
|
||||
or: { 'union': STRING, 'data': DICT, 'base': COMPLEX-TYPE-NAME,
|
||||
or: { 'union': STRING, 'data': DICT, 'base': STRUCT-NAME,
|
||||
'discriminator': ENUM-MEMBER-OF-BASE }
|
||||
|
||||
Union types are used to let the user choose between several different
|
||||
@ -272,8 +272,8 @@ paragraphs.
|
||||
A simple union type defines a mapping from automatic discriminator
|
||||
values to data types like in this example:
|
||||
|
||||
{ 'type': 'FileOptions', 'data': { 'filename': 'str' } }
|
||||
{ 'type': 'Qcow2Options',
|
||||
{ 'struct': 'FileOptions', 'data': { 'filename': 'str' } }
|
||||
{ 'struct': 'Qcow2Options',
|
||||
'data': { 'backing-file': 'str', 'lazy-refcounts': 'bool' } }
|
||||
|
||||
{ 'union': 'BlockdevOptions',
|
||||
@ -296,13 +296,13 @@ the union can be named 'max', as this would collide with the implicit
|
||||
enum. The value for each branch can be of any type.
|
||||
|
||||
|
||||
A flat union definition specifies a complex type as its base, and
|
||||
A flat union definition specifies a struct as its base, and
|
||||
avoids nesting on the wire. All branches of the union must be
|
||||
complex types, and the top-level fields of the union dictionary on
|
||||
the wire will be combination of fields from both the base type and the
|
||||
appropriate branch type (when merging two dictionaries, there must be
|
||||
no keys in common). The 'discriminator' field must be the name of an
|
||||
enum-typed member of the base type.
|
||||
enum-typed member of the base struct.
|
||||
|
||||
The following example enhances the above simple union example by
|
||||
adding a common field 'readonly', renaming the discriminator to
|
||||
@ -310,7 +310,7 @@ something more applicable, and reducing the number of {} required on
|
||||
the wire:
|
||||
|
||||
{ 'enum': 'BlockdevDriver', 'data': [ 'raw', 'qcow2' ] }
|
||||
{ 'type': 'BlockdevCommonOptions',
|
||||
{ 'struct': 'BlockdevCommonOptions',
|
||||
'data': { 'driver': 'BlockdevDriver', 'readonly': 'bool' } }
|
||||
{ 'union': 'BlockdevOptions',
|
||||
'base': 'BlockdevCommonOptions',
|
||||
@ -335,16 +335,16 @@ and then a union of structures for each branch of the struct.
|
||||
|
||||
A simple union can always be re-written as a flat union where the base
|
||||
class has a single member named 'type', and where each branch of the
|
||||
union has a complex type with a single member named 'data'. That is,
|
||||
union has a struct with a single member named 'data'. That is,
|
||||
|
||||
{ 'union': 'Simple', 'data': { 'one': 'str', 'two': 'int' } }
|
||||
|
||||
is identical on the wire to:
|
||||
|
||||
{ 'enum': 'Enum', 'data': ['one', 'two'] }
|
||||
{ 'type': 'Base', 'data': { 'type': 'Enum' } }
|
||||
{ 'type': 'Branch1', 'data': { 'data': 'str' } }
|
||||
{ 'type': 'Branch2', 'data': { 'data': 'int' } }
|
||||
{ 'struct': 'Base', 'data': { 'type': 'Enum' } }
|
||||
{ 'struct': 'Branch1', 'data': { 'data': 'str' } }
|
||||
{ 'struct': 'Branch2', 'data': { 'data': 'int' } }
|
||||
{ 'union': 'Flat': 'base': 'Base', 'discriminator': 'type',
|
||||
'data': { 'one': 'Branch1', 'two': 'Branch2' } }
|
||||
|
||||
@ -402,7 +402,7 @@ part of a QMP command. The 'data' member is optional and defaults to
|
||||
{} (an empty dictionary). If present, it must be the string name of a
|
||||
complex type, a one-element array containing the name of a complex
|
||||
type, or a dictionary that declares an anonymous type with the same
|
||||
semantics as a 'type' expression, with one exception noted below when
|
||||
semantics as a 'struct' expression, with one exception noted below when
|
||||
'gen' is used.
|
||||
|
||||
The 'returns' member describes what will appear in the "return" field
|
||||
@ -411,7 +411,7 @@ optional from the command declaration; if absent, the "return" field
|
||||
will be an empty dictionary. If 'returns' is present, it must be the
|
||||
string name of a complex or built-in type, a one-element array
|
||||
containing the name of a complex or built-in type, or a dictionary
|
||||
that declares an anonymous type with the same semantics as a 'type'
|
||||
that declares an anonymous type with the same semantics as a 'struct'
|
||||
expression, with one exception noted below when 'gen' is used.
|
||||
Although it is permitted to have the 'returns' member name a built-in
|
||||
type or an array of built-in types, any command that does this cannot
|
||||
@ -430,7 +430,7 @@ Some example commands:
|
||||
|
||||
{ 'command': 'my-first-command',
|
||||
'data': { 'arg1': 'str', '*arg2': 'str' } }
|
||||
{ 'type': 'MyType', 'data': { '*value': 'str' } }
|
||||
{ 'struct': 'MyType', 'data': { '*value': 'str' } }
|
||||
{ 'command': 'my-second-command',
|
||||
'returns': [ 'MyType' ] }
|
||||
|
||||
@ -474,7 +474,7 @@ Events are defined with the keyword 'event'. It is not allowed to
|
||||
name an event 'MAX', since the generator also produces a C enumeration
|
||||
of all event names with a generated _MAX value at the end. When
|
||||
'data' is also specified, additional info will be included in the
|
||||
event, with similar semantics to a 'type' expression. Finally there
|
||||
event, with similar semantics to a 'struct' expression. Finally there
|
||||
will be C API generated in qapi-event.h; when called by QEMU code, a
|
||||
message with timestamp will be emitted on the wire.
|
||||
|
||||
@ -505,7 +505,7 @@ case we want to accept/return a list of this type with a command), and a
|
||||
command which takes that type as a parameter and returns the same type:
|
||||
|
||||
$ cat example-schema.json
|
||||
{ 'type': 'UserDefOne',
|
||||
{ 'struct': 'UserDefOne',
|
||||
'data': { 'integer': 'int', 'string': 'str' } }
|
||||
|
||||
{ 'command': 'my-command',
|
||||
|
Loading…
Reference in New Issue
Block a user