| ====================== |
| 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 |
| 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 analogous 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 entries 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 } |
| } |
| |
| |
| ``:return-nodesc:`` |
| ------------------- |
| |
| Document the return type of a QAPI command, without an accompanying |
| description. |
| |
| :availability: This field list is only available in the body of the |
| Command directive. |
| :syntax: ``:return-nodesc: type`` |
| :type: `sphinx.util.docfields.Field |
| <https://pydoc.dev/sphinx/latest/sphinx.util.docfields.Field.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-nodesc: ReplayInfo |
| |
| .. 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 ... |
| |
| .. _QAPI-domain-cross-references: |
| |
| 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:`[QMP: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:`QMP: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:`QMP:block-core.BitmapSyncMode``` will render to: |
| :qapi:type:`QMP:block-core.BitmapSyncMode` |
| * If you don't want to display the "fully qualified" name, it can be |
| prefixed with a tilde; ``:qapi:type:`~QMP:block-core.BitmapSyncMode``` |
| will render to: :qapi:type:`~QMP: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 <QMP: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 explicitly 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. |