Eric Blake <ebl...@redhat.com> writes:

> From: Fam Zheng <f...@redhat.com>
>
> In the near term, we will use it for a sensible-looking
> 'gen':false inside command declarations, instead of the
> current ugly 'gen':'no'.
>
> In the long term, it will allow conversion from shorthand
> with defaults mentioned only in side-band documentation:
>  'data':{'*flag':'bool', '*string':'str'}
> into an explicit default value documentation, as in:
>  'data':{'flag':{'type':'bool', 'optional':true, 'default':true},
>          'string':{'type':'str', 'optional':true, 'default':null}}
>
> We still don't parse integer values (also necessary before
> we can allow explicit defaults), but that can come in a later
> series.
>
> Update the testsuite to match an improved error message.
>
> Signed-off-by: Fam Zheng <f...@redhat.com>
> Signed-off-by: Eric Blake <ebl...@redhat.com>
> ---
>  scripts/qapi.py                      | 21 ++++++++++++++++++---
>  tests/qapi-schema/bad-type-bool.err  |  2 +-
>  tests/qapi-schema/bad-type-bool.json |  1 -
>  3 files changed, 19 insertions(+), 5 deletions(-)
>
> diff --git a/scripts/qapi.py b/scripts/qapi.py
> index 5d0dc91..6ed6a34 100644
> --- a/scripts/qapi.py
> +++ b/scripts/qapi.py
> @@ -158,6 +158,20 @@ class QAPISchema:
>                          return
>                      else:
>                          string += ch
> +            elif self.tok in "tfn":
> +                val = self.src[self.cursor - 1:]
> +                if val.startswith("true"):
> +                    self.val = True
> +                    self.cursor += 3
> +                    return
> +                elif val.startswith("false"):
> +                    self.val = False
> +                    self.cursor += 4
> +                    return
> +                elif val.startswith("null"):
> +                    self.val = None
> +                    self.cursor += 3
> +                    return
>              elif self.tok == '\n':
>                  if self.cursor == len(self.src):
>                      self.tok = None
> @@ -197,8 +211,9 @@ class QAPISchema:
>          if self.tok == ']':
>              self.accept()
>              return expr
> -        if not self.tok in [ '{', '[', "'" ]:
> -            raise QAPISchemaError(self, 'Expected "{", "[", "]" or string')
> +        if not self.tok in "{['tfn":
> +            raise QAPISchemaError(self, 'Expected "{", "[", "]", string, '
> +                                  'boolean or "null"')
>          while True:
>              expr.append(self.get_expr(True))
>              if self.tok == ']':
> @@ -217,7 +232,7 @@ class QAPISchema:
>          elif self.tok == '[':
>              self.accept()
>              expr = self.get_values()
> -        elif self.tok == "'":
> +        elif self.tok in "'tfn":
>              expr = self.val
>              self.accept()
>          else:

Exploiting that the three literal names start with different letters is
a a hack, but it'll do.

Reviewed-by: Markus Armbruster <arm...@redhat.com>

[...]

Reply via email to