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: Fam Zheng <famz@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Fam Zheng 2015-05-04 09:05:18 -06:00 committed by Markus Armbruster
parent 4dc2e6906e
commit e53188ada5
3 changed files with 19 additions and 5 deletions

View File

@ -158,6 +158,20 @@ class QAPISchema:
return return
else: else:
string += ch 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': elif self.tok == '\n':
if self.cursor == len(self.src): if self.cursor == len(self.src):
self.tok = None self.tok = None
@ -197,8 +211,9 @@ class QAPISchema:
if self.tok == ']': if self.tok == ']':
self.accept() self.accept()
return expr return expr
if not self.tok in [ '{', '[', "'" ]: if not self.tok in "{['tfn":
raise QAPISchemaError(self, 'Expected "{", "[", "]" or string') raise QAPISchemaError(self, 'Expected "{", "[", "]", string, '
'boolean or "null"')
while True: while True:
expr.append(self.get_expr(True)) expr.append(self.get_expr(True))
if self.tok == ']': if self.tok == ']':
@ -217,7 +232,7 @@ class QAPISchema:
elif self.tok == '[': elif self.tok == '[':
self.accept() self.accept()
expr = self.get_values() expr = self.get_values()
elif self.tok == "'": elif self.tok in "'tfn":
expr = self.val expr = self.val
self.accept() self.accept()
else: else:

View File

@ -1 +1 @@
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

View File

@ -1,3 +1,2 @@
# we reject an expression with a metatype that is not a string # 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': { } } { 'type': true, 'data': { } }