@@ -996,7 +996,8 @@ line "Features:", like this::
A tagged section begins with a paragraph that starts with one of the
following words: "Note:"/"Notes:", "Since:", "Example:"/"Examples:",
-"Returns:", "TODO:". It ends with the start of a new section.
+"Returns:", "Errors:", "TODO:". It ends with the start of a new
+section.
The second and subsequent lines of tagged sections must be indented
like this::
@@ -1007,6 +1008,9 @@ like this::
# Duis aute irure dolor in reprehenderit in voluptate velit esse
# cillum dolore eu fugiat nulla pariatur.
+"Returns" and "Errors" sections are only valid for commands. They
+document the success and the error response, respectively.
+
A "Since: x.y.z" tagged section lists the release that introduced the
definition.
@@ -543,7 +543,7 @@ def get_doc(self) -> 'QAPIDoc':
line = self.get_doc_indented(doc)
no_more_args = True
elif match := re.match(
- r'(Returns|Since|Notes?|Examples?|TODO): *',
+ r'(Returns|Errors|Since|Notes?|Examples?|TODO): *',
line):
# tagged section
doc.new_tagged_section(self.info, match.group(1))
@@ -639,8 +639,9 @@ def __init__(self, info: QAPISourceInfo, symbol: Optional[str] = None):
# dicts mapping parameter/feature names to their description
self.args: Dict[str, QAPIDoc.ArgSection] = {}
self.features: Dict[str, QAPIDoc.ArgSection] = {}
- # a command's "Returns" section
+ # a command's "Returns" and "Errors" section
self.returns: Optional[QAPIDoc.Section] = None
+ self.errors: Optional[QAPIDoc.Section] = None
# "Since" section
self.since: Optional[QAPIDoc.Section] = None
# sections other than .body, .args, .features
@@ -670,6 +671,11 @@ def new_tagged_section(self, info: QAPISourceInfo, tag: str) -> None:
raise QAPISemError(
info, "duplicated '%s' section" % tag)
self.returns = section
+ elif tag == 'Errors':
+ if self.errors:
+ raise QAPISemError(
+ info, "duplicated '%s' section" % tag)
+ self.errors = section
elif tag == 'Since':
if self.since:
raise QAPISemError(
@@ -715,10 +721,15 @@ def connect_feature(self, feature: 'QAPISchemaFeature') -> None:
self.features[feature.name].connect(feature)
def check_expr(self, expr: QAPIExpression) -> None:
- if self.returns and 'command' not in expr:
- raise QAPISemError(
- self.returns.info,
- "'Returns' section is only valid for commands")
+ if 'command' not in expr:
+ if self.returns:
+ raise QAPISemError(
+ self.returns.info,
+ "'Returns' section is only valid for commands")
+ if self.errors:
+ raise QAPISemError(
+ self.returns.info,
+ "'Errors' section is only valid for commands")
def check(self) -> None:
@@ -159,6 +159,8 @@
#
# Returns: @Object
#
+# Errors: some
+#
# TODO: frobnicate
#
# Notes:
@@ -173,6 +173,8 @@ another feature
@arg3 is undocumented
section=Returns
@Object
+ section=Errors
+some
section=TODO
frobnicate
section=Notes
@@ -206,6 +206,12 @@ Returns
"Object"
+Errors
+~~~~~~
+
+some
+
+
Notes
~~~~~
We use section "Returns" for documenting both success and error response of commands. I intend to generate better command success response documentation. Easier when "Returns" documents just he success response. Create new section tag "Errors". The next two commits will move error response documentation from "Returns" sections to "Errors" sections. Signed-off-by: Markus Armbruster <armbru@redhat.com> --- docs/devel/qapi-code-gen.rst | 6 +++++- scripts/qapi/parser.py | 23 +++++++++++++++++------ tests/qapi-schema/doc-good.json | 2 ++ tests/qapi-schema/doc-good.out | 2 ++ tests/qapi-schema/doc-good.txt | 6 ++++++ 5 files changed, 32 insertions(+), 7 deletions(-)