Skip to content

Commit

Permalink
qapi: Allow true, false and null in schema json
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Fam Zheng authored and Markus Armbruster committed May 5, 2015
1 parent 4dc2e69 commit e53188a
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 5 deletions.
21 changes: 18 additions & 3 deletions scripts/qapi.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,20 @@ def accept(self):
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
Expand Down Expand Up @@ -197,8 +211,9 @@ def get_values(self):
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 == ']':
Expand All @@ -217,7 +232,7 @@ def get_expr(self, nested):
elif self.tok == '[':
self.accept()
expr = self.get_values()
elif self.tok == "'":
elif self.tok in "'tfn":
expr = self.val
self.accept()
else:
Expand Down
2 changes: 1 addition & 1 deletion tests/qapi-schema/bad-type-bool.err
Original file line number Diff line number Diff line change
@@ -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
1 change: 0 additions & 1 deletion tests/qapi-schema/bad-type-bool.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
# 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': { } }

0 comments on commit e53188a

Please sign in to comment.