Commit e53188ad authored by Fam Zheng's avatar Fam Zheng Committed by Markus Armbruster
Browse files

qapi: Allow true, false and null in schema json



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: default avatarFam Zheng <famz@redhat.com>
Signed-off-by: default avatarEric Blake <eblake@redhat.com>
Reviewed-by: default avatarMarkus Armbruster <armbru@redhat.com>
Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
parent 4dc2e690
Loading
Loading
Loading
Loading
+18 −3
Original line number Diff line number Diff line
@@ -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:
+1 −1
Original line number Diff line number Diff line
tests/qapi-schema/bad-type-bool.json:3:11: Stray "t"
tests/qapi-schema/bad-type-bool.json:2: 'type' key must have a string value
+0 −1
Original line number Diff line number Diff line
# we reject an expression with a metatype that is not a string
# FIXME: once the parser understands bool inputs, improve the error message
{ 'type': true, 'data': { } }