mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 07:13:54 -06:00

This patch does three things: 1. Record the current namespace context in pending_xrefs so it can be used for link resolution later, 2. Pass that recorded namespace context to find_obj() when resolving a reference, and 3. Wildly and completely rewrite find_obj(). cross-reference support is expanded to tolerate the presence or absence of either namespace or module, and to cope with the presence or absence of contextual information for either. References now work like this: 1. If the explicit reference target is recorded in the domain's object registry, we link to that target and stop looking. We do this lookup regardless of how fully qualified the target is, which allows direct references to modules (which don't have a module component to their names) or direct references to definitions that may or may not belong to a namespace or module. 2. If contextual information is available from qapi:namespace or qapi:module directives, try using those components to find a direct match to the implied target name. 3. If both prior lookups fail, generate a series of regular expressions looking for wildcard matches in order from most to least specific. Any explicitly provided components (namespace, module) *must* match exactly, but both contextual and entirely omitted components are allowed to differ from the search result. Note that if more than one result is found, Sphinx will emit a warning (a build error for QEMU) and list all of the candidate references. The practical upshot is that in the large majority of cases, namespace and module information is not required when creating simple `references` to definitions from within the same context -- even when identical definitions exist in other contexts. Even when using simple `references` from elsewhere in the QEMU documentation manual, explicit namespace info is not required if there is only one definition by that name. Disambiguation *will* be required from outside of the QAPI documentation when referencing e.g. block-core definitions, which are shared between QEMU QMP and the QEMU Storage Daemon. In that case, there are two options: A: References can be made partially or fully explicit, e.g. `QMP:block-dirty-bitmap-add` will link to the QEMU version of the definition, while `QSD:block-dirty-bitmap-add` would link to the QSD version. B: If all of the references in a document are intended to go to the same place, you can insert a "qapi:namespace:: QMP" directive to influence the fuzzy-searching for later references. Signed-off-by: John Snow <jsnow@redhat.com> Message-ID: <20250313044312.189276-8-jsnow@redhat.com> Acked-by: Markus Armbruster <armbru@redhat.com> [Commit message typo fixed] Signed-off-by: Markus Armbruster <armbru@redhat.com>
716 lines
24 KiB
ReStructuredText
716 lines
24 KiB
ReStructuredText
======================
|
|
The Sphinx QAPI Domain
|
|
======================
|
|
|
|
An extension to the `rST syntax
|
|
<https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_
|
|
in Sphinx is provided by the QAPI Domain, located in
|
|
``docs/sphinx/qapi_domain.py``. This extension is analogous to the
|
|
`Python Domain
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/python.html>`_
|
|
included with Sphinx, but provides special directives and roles
|
|
speciically for annotating and documenting QAPI definitions
|
|
specifically.
|
|
|
|
A `Domain
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/index.html>`_
|
|
provides a set of special rST directives and cross-referencing roles to
|
|
Sphinx for understanding rST markup written to document a specific
|
|
language. By itself, this QAPI extension is only sufficient to parse rST
|
|
markup written by hand; the `autodoc
|
|
<https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html>`_
|
|
functionality is provided elsewhere, in ``docs/sphinx/qapidoc.py``, by
|
|
the "Transmogrifier".
|
|
|
|
It is not expected that any developer nor documentation writer would
|
|
never need to write *nor* read these special rST forms. However, in the
|
|
event that something needs to be debugged, knowing the syntax of the
|
|
domain is quite handy. This reference may also be useful as a guide for
|
|
understanding the QAPI Domain extension code itself. Although most of
|
|
these forms will not be needed for documentation writing purposes,
|
|
understanding the cross-referencing syntax *will* be helpful when
|
|
writing rST documentation elsewhere, or for enriching the body of
|
|
QAPIDoc blocks themselves.
|
|
|
|
|
|
Concepts
|
|
========
|
|
|
|
The QAPI Domain itself provides no mechanisms for reading the QAPI
|
|
Schema or generating documentation from code that exists. It is merely
|
|
the rST syntax used to describe things. For instance, the Sphinx Python
|
|
domain adds syntax like ``:py:func:`` for describing Python functions in
|
|
documentation, but it's the autodoc module that is responsible for
|
|
reading python code and generating such syntax. QAPI is analagous here:
|
|
qapidoc.py is responsible for reading the QAPI Schema and generating rST
|
|
syntax, and qapi_domain.py is responsible for translating that special
|
|
syntax and providing APIs for Sphinx internals.
|
|
|
|
In other words:
|
|
|
|
qapi_domain.py adds syntax like ``.. qapi:command::`` to Sphinx, and
|
|
qapidoc.py transforms the documentation in ``qapi/*.json`` into rST
|
|
using directives defined by the domain.
|
|
|
|
Or even shorter:
|
|
|
|
``:py:`` is to ``:qapi:`` as *autodoc* is to *qapidoc*.
|
|
|
|
|
|
Info Field Lists
|
|
================
|
|
|
|
`Field lists
|
|
<https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html#field-lists>`_
|
|
are a standard syntax in reStructuredText. Sphinx `extends that syntax
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/python.html#info-field-lists>`_
|
|
to give certain field list entries special meaning and parsing to, for
|
|
example, add cross-references. The QAPI Domain takes advantage of this
|
|
field list extension to document things like Arguments, Members, Values,
|
|
and so on.
|
|
|
|
The special parsing and handling of info field lists in Sphinx is provided by
|
|
three main classes; Field, GroupedField, and TypedField. The behavior
|
|
and formatting for each configured field list entry in the domain
|
|
changes depending on which class is used.
|
|
|
|
Field:
|
|
* Creates an ungrouped field: i.e., each entry will create its own
|
|
section and they will not be combined.
|
|
* May *optionally* support an argument.
|
|
* May apply cross-reference roles to *either* the argument *or* the
|
|
content body, both, or neither.
|
|
|
|
This is used primarily for entries which are not expected to be
|
|
repeated, i.e., items that may only show up at most once. The QAPI
|
|
domain uses this class for "Errors" section.
|
|
|
|
GroupedField:
|
|
* Creates a grouped field: i.e. multiple adjacent entries will be
|
|
merged into one section, and the content will form a bulleted list.
|
|
* *Must* take an argument.
|
|
* May optionally apply a cross-reference role to the argument, but not
|
|
the body.
|
|
* Can be configured to remove the bulleted list if there is only a
|
|
single entry.
|
|
* All items will be generated with the form: "argument -- body"
|
|
|
|
This is used for entries which are expected to be repeated, but aren't
|
|
expected to have two arguments, i.e. types without names, or names
|
|
without types. The QAPI domain uses this class for features, returns,
|
|
and enum values.
|
|
|
|
TypedField:
|
|
* Creates a grouped, typed field. Multiple adjacent entres will be
|
|
merged into one section, and the content will form a bulleted list.
|
|
* *Must* take at least one argument, but supports up to two -
|
|
nominally, a name and a type.
|
|
* May optionally apply a cross-reference role to the type or the name
|
|
argument, but not the body.
|
|
* Can be configured to remove the bulleted list if there is only a
|
|
single entry.
|
|
* All items will be generated with the form "name (type) -- body"
|
|
|
|
This is used for entries that are expected to be repeated and will have
|
|
a name, a type, and a description. The QAPI domain uses this class for
|
|
arguments, alternatives, and members. Wherever type names are referenced
|
|
below, They must be a valid, documented type that will be
|
|
cross-referenced in the HTML output; or one of the built-in JSON types
|
|
(string, number, int, boolean, null, value, q_empty).
|
|
|
|
|
|
``:feat:``
|
|
----------
|
|
|
|
Document a feature attached to a QAPI definition.
|
|
|
|
:availability: This field list is available in the body of Command,
|
|
Event, Enum, Object and Alternate directives.
|
|
:syntax: ``:feat name: Lorem ipsum, dolor sit amet...``
|
|
:type: `sphinx.util.docfields.GroupedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
|
|
|
|
Example::
|
|
|
|
.. qapi:object:: BlockdevOptionsVirtioBlkVhostVdpa
|
|
:since: 7.2
|
|
:ifcond: CONFIG_BLKIO
|
|
|
|
Driver specific block device options for the virtio-blk-vhost-vdpa
|
|
backend.
|
|
|
|
:memb string path: path to the vhost-vdpa character device.
|
|
:feat fdset: Member ``path`` supports the special "/dev/fdset/N" path
|
|
(since 8.1)
|
|
|
|
|
|
``:arg:``
|
|
---------
|
|
|
|
Document an argument to a QAPI command.
|
|
|
|
:availability: This field list is only available in the body of the
|
|
Command directive.
|
|
:syntax: ``:arg type name: description``
|
|
:type: `sphinx.util.docfields.TypedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
|
|
|
|
|
|
Example::
|
|
|
|
.. qapi:command:: job-pause
|
|
:since: 3.0
|
|
|
|
Pause an active job.
|
|
|
|
This command returns immediately after marking the active job for
|
|
pausing. Pausing an already paused job is an error.
|
|
|
|
The job will pause as soon as possible, which means transitioning
|
|
into the PAUSED state if it was RUNNING, or into STANDBY if it was
|
|
READY. The corresponding JOB_STATUS_CHANGE event will be emitted.
|
|
|
|
Cancelling a paused job automatically resumes it.
|
|
|
|
:arg string id: The job identifier.
|
|
|
|
|
|
``:error:``
|
|
-----------
|
|
|
|
Document the error condition(s) of a QAPI command.
|
|
|
|
:availability: This field list is only available in the body of the
|
|
Command directive.
|
|
:syntax: ``:error: Lorem ipsum dolor sit amet ...``
|
|
:type: `sphinx.util.docfields.Field
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.Field.html?private=1>`_
|
|
|
|
The format of the :errors: field list description is free-form rST. The
|
|
alternative spelling ":errors:" is also permitted, but strictly
|
|
analogous.
|
|
|
|
Example::
|
|
|
|
.. qapi:command:: block-job-set-speed
|
|
:since: 1.1
|
|
|
|
Set maximum speed for a background block operation.
|
|
|
|
This command can only be issued when there is an active block job.
|
|
|
|
Throttling can be disabled by setting the speed to 0.
|
|
|
|
:arg string device: The job identifier. This used to be a device
|
|
name (hence the name of the parameter), but since QEMU 2.7 it
|
|
can have other values.
|
|
:arg int speed: the maximum speed, in bytes per second, or 0 for
|
|
unlimited. Defaults to 0.
|
|
:error:
|
|
- If no background operation is active on this device,
|
|
DeviceNotActive
|
|
|
|
|
|
``:return:``
|
|
-------------
|
|
|
|
Document the return type(s) and value(s) of a QAPI command.
|
|
|
|
:availability: This field list is only available in the body of the
|
|
Command directive.
|
|
:syntax: ``:return type: Lorem ipsum dolor sit amet ...``
|
|
:type: `sphinx.util.docfields.GroupedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
|
|
|
|
|
|
Example::
|
|
|
|
.. qapi:command:: query-replay
|
|
:since: 5.2
|
|
|
|
Retrieve the record/replay information. It includes current
|
|
instruction count which may be used for ``replay-break`` and
|
|
``replay-seek`` commands.
|
|
|
|
:return ReplayInfo: record/replay information.
|
|
|
|
.. qmp-example::
|
|
|
|
-> { "execute": "query-replay" }
|
|
<- { "return": {
|
|
"mode": "play", "filename": "log.rr", "icount": 220414 }
|
|
}
|
|
|
|
|
|
``:value:``
|
|
-----------
|
|
|
|
Document a possible value for a QAPI enum.
|
|
|
|
:availability: This field list is only available in the body of the Enum
|
|
directive.
|
|
:syntax: ``:value name: Lorem ipsum, dolor sit amet ...``
|
|
:type: `sphinx.util.docfields.GroupedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.GroupedField.html?private=1>`_
|
|
|
|
Example::
|
|
|
|
.. qapi:enum:: QapiErrorClass
|
|
:since: 1.2
|
|
|
|
QEMU error classes
|
|
|
|
:value GenericError: this is used for errors that don't require a specific
|
|
error class. This should be the default case for most errors
|
|
:value CommandNotFound: the requested command has not been found
|
|
:value DeviceNotActive: a device has failed to be become active
|
|
:value DeviceNotFound: the requested device has not been found
|
|
:value KVMMissingCap: the requested operation can't be fulfilled because a
|
|
required KVM capability is missing
|
|
|
|
|
|
``:alt:``
|
|
------------
|
|
|
|
Document a possible branch for a QAPI alternate.
|
|
|
|
:availability: This field list is only available in the body of the
|
|
Alternate directive.
|
|
:syntax: ``:alt type name: Lorem ipsum, dolor sit amet ...``
|
|
:type: `sphinx.util.docfields.TypedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
|
|
|
|
As a limitation of Sphinx, we must document the "name" of the branch in
|
|
addition to the type, even though this information is not visible on the
|
|
wire in the QMP protocol format. This limitation *may* be lifted at a
|
|
future date.
|
|
|
|
Example::
|
|
|
|
.. qapi:alternate:: StrOrNull
|
|
:since: 2.10
|
|
|
|
This is a string value or the explicit lack of a string (null
|
|
pointer in C). Intended for cases when 'optional absent' already
|
|
has a different meaning.
|
|
|
|
:alt string s: the string value
|
|
:alt null n: no string value
|
|
|
|
|
|
``:memb:``
|
|
----------
|
|
|
|
Document a member of an Event or Object.
|
|
|
|
:availability: This field list is available in the body of Event or
|
|
Object directives.
|
|
:syntax: ``:memb type name: Lorem ipsum, dolor sit amet ...``
|
|
:type: `sphinx.util.docfields.TypedField
|
|
<https://pydoc.dev/sphinx/latest/sphinx.util.docfields.TypedField.html?private=1>`_
|
|
|
|
This is fundamentally the same as ``:arg:`` and ``:alt:``, but uses the
|
|
"Members" phrasing for Events and Objects (Structs and Unions).
|
|
|
|
Example::
|
|
|
|
.. qapi:event:: JOB_STATUS_CHANGE
|
|
:since: 3.0
|
|
|
|
Emitted when a job transitions to a different status.
|
|
|
|
:memb string id: The job identifier
|
|
:memb JobStatus status: The new job status
|
|
|
|
|
|
Arbitrary field lists
|
|
---------------------
|
|
|
|
Other field list names, while valid rST syntax, are prohibited inside of
|
|
QAPI directives to help prevent accidental misspellings of info field
|
|
list names. If you want to add a new arbitrary "non-value-added" field
|
|
list to QAPI documentation, you must add the field name to the allow
|
|
list in ``docs/conf.py``
|
|
|
|
For example::
|
|
|
|
qapi_allowed_fields = {
|
|
"see also",
|
|
}
|
|
|
|
Will allow you to add arbitrary field lists in QAPI directives::
|
|
|
|
.. qapi:command:: x-fake-command
|
|
|
|
:see also: Lorem ipsum, dolor sit amet ...
|
|
|
|
|
|
Cross-references
|
|
================
|
|
|
|
Cross-reference `roles
|
|
<https://www.sphinx-doc.org/en/master/usage/restructuredtext/roles.html>`_
|
|
in the QAPI domain are modeled closely after the `Python
|
|
cross-referencing syntax
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/python.html#cross-referencing-python-objects>`_.
|
|
|
|
QAPI definitions can be referenced using the standard `any
|
|
<https://www.sphinx-doc.org/en/master/usage/referencing.html#role-any>`_
|
|
role cross-reference syntax, such as with ```query-blockstats```. In
|
|
the event that disambiguation is needed, cross-references can also be
|
|
written using a number of explicit cross-reference roles:
|
|
|
|
* ``:qapi:mod:`block-core``` -- Reference a QAPI module. The link will
|
|
take you to the beginning of that section in the documentation.
|
|
* ``:qapi:cmd:`query-block``` -- Reference a QAPI command.
|
|
* ``:qapi:event:`JOB_STATUS_CHANGE``` -- Reference a QAPI event.
|
|
* ``:qapi:enum:`QapiErrorClass``` -- Reference a QAPI enum.
|
|
* ``:qapi:obj:`BlockdevOptionsVirtioBlkVhostVdpa`` -- Reference a QAPI
|
|
object (struct or union)
|
|
* ``:qapi:alt:`StrOrNull``` -- Reference a QAPI alternate.
|
|
* ``:qapi:type:`BlockDirtyInfo``` -- Reference *any* QAPI type; this
|
|
excludes modules, commands, and events.
|
|
* ``:qapi:any:`block-job-set-speed``` -- Reference absolutely any QAPI entity.
|
|
|
|
Type arguments in info field lists are converted into references as if
|
|
you had used the ``:qapi:type:`` role. All of the special syntax below
|
|
applies to both info field lists and standalone explicit
|
|
cross-references.
|
|
|
|
|
|
Type decorations
|
|
----------------
|
|
|
|
Type names in references can be surrounded by brackets, like
|
|
``[typename]``, to indicate an array of that type. The cross-reference
|
|
will apply only to the type name between the brackets. For example;
|
|
``:qapi:type:`[Qcow2BitmapInfoFlags]``` renders to:
|
|
:qapi:type:`[Qcow2BitmapInfoFlags]`
|
|
|
|
To indicate an optional argument/member in a field list, the type name
|
|
can be suffixed with ``?``. The cross-reference will be transformed to
|
|
"type, Optional" with the link applying only to the type name. For
|
|
example; ``:qapi:type:`BitmapSyncMode?``` renders to:
|
|
:qapi:type:`BitmapSyncMode?`
|
|
|
|
|
|
Namespaces
|
|
----------
|
|
|
|
Mimicking the `Python domain target specification syntax
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/python.html#target-specification>`_,
|
|
QAPI allows you to specify the fully qualified path for a data
|
|
type.
|
|
|
|
* A namespace can be explicitly provided;
|
|
e.g. ``:qapi:type:`QMP:BitmapSyncMode``
|
|
* A module can be explicitly provided;
|
|
``:qapi:type:`block-core.BitmapSyncMode``` will render to:
|
|
:qapi:type:`block-core.BitmapSyncMode`
|
|
* If you don't want to display the "fully qualified" name, it can be
|
|
prefixed with a tilde; ``:qapi:type:`~block-core.BitmapSyncMode```
|
|
will render to: :qapi:type:`~block-core.BitmapSyncMode`
|
|
|
|
|
|
Target resolution
|
|
-----------------
|
|
|
|
Any cross-reference to a QAPI type, whether using the ```any``` style of
|
|
reference or the more explicit ```:qapi:any:`target``` syntax, allows
|
|
for the presence or absence of either the namespace or module
|
|
information.
|
|
|
|
When absent, their value will be inferred from context by the presence
|
|
of any ``qapi:namespace`` or ``qapi:module`` directives preceding the
|
|
cross-reference.
|
|
|
|
If no results are found when using the inferred values, other
|
|
namespaces/modules will be searched as a last resort; but any explicitly
|
|
provided values must always match in order to succeed.
|
|
|
|
This allows for efficient cross-referencing with a minimum of syntax in
|
|
the large majority of cases, but additional context or namespace markup
|
|
may be required outside of the QAPI reference documents when linking to
|
|
items that share a name across multiple documented QAPI schema.
|
|
|
|
|
|
Custom link text
|
|
----------------
|
|
|
|
The name of a cross-reference link can be explicitly overridden like
|
|
`most stock Sphinx references
|
|
<https://www.sphinx-doc.org/en/master/usage/referencing.html#syntax>`_
|
|
using the ``custom text <target>`` syntax.
|
|
|
|
For example, ``:qapi:cmd:`Merge dirty bitmaps
|
|
<block-dirty-bitmap-merge>``` will render as: :qapi:cmd:`Merge dirty
|
|
bitmaps <block-dirty-bitmap-merge>`
|
|
|
|
|
|
Directives
|
|
==========
|
|
|
|
The QAPI domain adds a number of custom directives for documenting
|
|
various QAPI/QMP entities. The syntax is plain rST, and follows this
|
|
general format::
|
|
|
|
.. qapi:directive:: argument
|
|
:option:
|
|
:another-option: with an argument
|
|
|
|
Content body, arbitrary rST is allowed here.
|
|
|
|
|
|
Sphinx standard options
|
|
-----------------------
|
|
|
|
All QAPI directives inherit a number of `standard options
|
|
<https://www.sphinx-doc.org/en/master/usage/domains/index.html#basic-markup>`_
|
|
from Sphinx's ObjectDescription class.
|
|
|
|
The dashed spellings of the below options were added in Sphinx 7.2, the
|
|
undashed spellings are currently retained as aliases, but will be
|
|
removed in a future version.
|
|
|
|
* ``:no-index:`` and ``:noindex:`` -- Do not add this item into the
|
|
Index, and do not make it available for cross-referencing.
|
|
* ``no-index-entry:`` and ``:noindexentry:`` -- Do not add this item
|
|
into the Index, but allow it to be cross-referenced.
|
|
* ``no-contents-entry`` and ``:nocontentsentry:`` -- Exclude this item
|
|
from the Table of Contents.
|
|
* ``no-typesetting`` -- Create TOC, Index and cross-referencing
|
|
entities, but don't actually display the content.
|
|
|
|
|
|
QAPI standard options
|
|
---------------------
|
|
|
|
All QAPI directives -- *except* for namespace and module -- support
|
|
these common options.
|
|
|
|
* ``:namespace: name`` -- This option allows you to override the
|
|
namespace association of a given definition.
|
|
* ``:module: modname`` -- Borrowed from the Python domain, this option allows
|
|
you to override the module association of a given definition.
|
|
* ``:since: x.y`` -- Allows the documenting of "Since" information, which is
|
|
displayed in the signature bar.
|
|
* ``:ifcond: CONDITION`` -- Allows the documenting of conditional availability
|
|
information, which is displayed in an eyecatch just below the
|
|
signature bar.
|
|
* ``:deprecated:`` -- Adds an eyecatch just below the signature bar that
|
|
advertises that this definition is deprecated and should be avoided.
|
|
* ``:unstable:`` -- Adds an eyecatch just below the signature bar that
|
|
advertises that this definition is unstable and should not be used in
|
|
production code.
|
|
|
|
|
|
qapi:namespace
|
|
--------------
|
|
|
|
The ``qapi:namespace`` directive marks the start of a QAPI namespace. It
|
|
does not take a content body, nor any options. All subsequent QAPI
|
|
directives are associated with the most recent namespace. This affects
|
|
the definition's "fully qualified name", allowing two different
|
|
namespaces to create an otherwise identically named definition.
|
|
|
|
This directive also influences how reference resolution works for any
|
|
references that do not explicity specify a namespace, so this directive
|
|
can be used to nudge references into preferring targets from within that
|
|
namespace.
|
|
|
|
Example::
|
|
|
|
.. qapi:namespace:: QMP
|
|
|
|
|
|
This directive has no visible effect.
|
|
|
|
|
|
qapi:module
|
|
-----------
|
|
|
|
The ``qapi:module`` directive marks the start of a QAPI module. It may have
|
|
a content body, but it can be omitted. All subsequent QAPI directives
|
|
are associated with the most recent module; this effects their "fully
|
|
qualified" name, but has no other effect.
|
|
|
|
Example::
|
|
|
|
.. qapi:module:: block-core
|
|
|
|
Welcome to the block-core module!
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:module:: block-core
|
|
:noindex:
|
|
|
|
Welcome to the block-core module!
|
|
|
|
|
|
qapi:command
|
|
------------
|
|
|
|
This directive documents a QMP command. It may use any of the standard
|
|
Sphinx or QAPI options, and the documentation body may contain
|
|
``:arg:``, ``:feat:``, ``:error:``, or ``:return:`` info field list
|
|
entries.
|
|
|
|
Example::
|
|
|
|
.. qapi:command:: x-fake-command
|
|
:since: 42.0
|
|
:unstable:
|
|
|
|
This command is fake, so it can't hurt you!
|
|
|
|
:arg int foo: Your favorite number.
|
|
:arg string? bar: Your favorite season.
|
|
:return [string]: A lovely computer-written poem for you.
|
|
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:command:: x-fake-command
|
|
:noindex:
|
|
:since: 42.0
|
|
:unstable:
|
|
|
|
This command is fake, so it can't hurt you!
|
|
|
|
:arg int foo: Your favorite number.
|
|
:arg string? bar: Your favorite season.
|
|
:return [string]: A lovely computer-written poem for you.
|
|
|
|
|
|
qapi:event
|
|
----------
|
|
|
|
This directive documents a QMP event. It may use any of the standard
|
|
Sphinx or QAPI options, and the documentation body may contain
|
|
``:memb:`` or ``:feat:`` info field list entries.
|
|
|
|
Example::
|
|
|
|
.. qapi:event:: COMPUTER_IS_RUINED
|
|
:since: 0.1
|
|
:deprecated:
|
|
|
|
This event is emitted when your computer is *extremely* ruined.
|
|
|
|
:memb string reason: Diagnostics as to what caused your computer to
|
|
be ruined.
|
|
:feat sadness: When present, the diagnostic message will also
|
|
explain how sad the computer is as a result of your wrongdoings.
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:event:: COMPUTER_IS_RUINED
|
|
:noindex:
|
|
:since: 0.1
|
|
:deprecated:
|
|
|
|
This event is emitted when your computer is *extremely* ruined.
|
|
|
|
:memb string reason: Diagnostics as to what caused your computer to
|
|
be ruined.
|
|
:feat sadness: When present, the diagnostic message will also explain
|
|
how sad the computer is as a result of your wrongdoings.
|
|
|
|
|
|
qapi:enum
|
|
---------
|
|
|
|
This directive documents a QAPI enum. It may use any of the standard
|
|
Sphinx or QAPI options, and the documentation body may contain
|
|
``:value:`` or ``:feat:`` info field list entries.
|
|
|
|
Example::
|
|
|
|
.. qapi:enum:: Mood
|
|
:ifcond: LIB_PERSONALITY
|
|
|
|
This enum represents your virtual machine's current mood!
|
|
|
|
:value Happy: Your VM is content and well-fed.
|
|
:value Hungry: Your VM needs food.
|
|
:value Melancholic: Your VM is experiencing existential angst.
|
|
:value Petulant: Your VM is throwing a temper tantrum.
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:enum:: Mood
|
|
:noindex:
|
|
:ifcond: LIB_PERSONALITY
|
|
|
|
This enum represents your virtual machine's current mood!
|
|
|
|
:value Happy: Your VM is content and well-fed.
|
|
:value Hungry: Your VM needs food.
|
|
:value Melancholic: Your VM is experiencing existential angst.
|
|
:value Petulant: Your VM is throwing a temper tantrum.
|
|
|
|
|
|
qapi:object
|
|
-----------
|
|
|
|
This directive documents a QAPI structure or union and represents a QMP
|
|
object. It may use any of the standard Sphinx or QAPI options, and the
|
|
documentation body may contain ``:memb:`` or ``:feat:`` info field list
|
|
entries.
|
|
|
|
Example::
|
|
|
|
.. qapi:object:: BigBlobOfStuff
|
|
|
|
This object has a bunch of disparate and unrelated things in it.
|
|
|
|
:memb int Birthday: Your birthday, represented in seconds since the
|
|
UNIX epoch.
|
|
:memb [string] Fav-Foods: A list of your favorite foods.
|
|
:memb boolean? Bizarre-Docs: True if the documentation reference
|
|
should be strange.
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:object:: BigBlobOfStuff
|
|
:noindex:
|
|
|
|
This object has a bunch of disparate and unrelated things in it.
|
|
|
|
:memb int Birthday: Your birthday, represented in seconds since the
|
|
UNIX epoch.
|
|
:memb [string] Fav-Foods: A list of your favorite foods.
|
|
:memb boolean? Bizarre-Docs: True if the documentation reference
|
|
should be strange.
|
|
|
|
|
|
qapi:alternate
|
|
--------------
|
|
|
|
This directive documents a QAPI alternate. It may use any of the
|
|
standard Sphinx or QAPI options, and the documentation body may contain
|
|
``:alt:`` or ``:feat:`` info field list entries.
|
|
|
|
Example::
|
|
|
|
.. qapi:alternate:: ErrorCode
|
|
|
|
This alternate represents an Error Code from the VM.
|
|
|
|
:alt int ec: An error code, like the type you're used to.
|
|
:alt string em: An expletive-laced error message, if your
|
|
computer is feeling particularly cranky and tired of your
|
|
antics.
|
|
|
|
Will be rendered as:
|
|
|
|
.. qapi:alternate:: ErrorCode
|
|
:noindex:
|
|
|
|
This alternate represents an Error Code from the VM.
|
|
|
|
:alt int ec: An error code, like the type you're used to.
|
|
:alt string em: An expletive-laced error message, if your
|
|
computer is feeling particularly cranky and tired of your
|
|
antics.
|