qapi: factor out checking for keys

Introduce a new helper function to check if the given keys are known,
and if mandatory keys are present. The function will be reused in
other places in the following code changes.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20181213123724.4866-5-marcandre.lureau@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Marc-André Lureau 2018-12-13 16:37:06 +04:00 committed by Markus Armbruster
parent 1e381b6559
commit 563bd35d87

View File

@ -873,6 +873,17 @@ def check_struct(expr, info):
allow_metas=['struct']) allow_metas=['struct'])
def check_known_keys(info, source, keys, required, optional):
for key in keys:
if key not in required and key not in optional:
raise QAPISemError(info, "Unknown key '%s' in %s" % (key, source))
for key in required:
if key not in keys:
raise QAPISemError(info, "Key '%s' is missing from %s"
% (key, source))
def check_keys(expr_elem, meta, required, optional=[]): def check_keys(expr_elem, meta, required, optional=[]):
expr = expr_elem['expr'] expr = expr_elem['expr']
info = expr_elem['info'] info = expr_elem['info']
@ -880,10 +891,9 @@ def check_keys(expr_elem, meta, required, optional=[]):
if not isinstance(name, str): if not isinstance(name, str):
raise QAPISemError(info, "'%s' key must have a string value" % meta) raise QAPISemError(info, "'%s' key must have a string value" % meta)
required = required + [meta] required = required + [meta]
source = "%s '%s'" % (meta, name)
check_known_keys(info, source, expr.keys(), required, optional)
for (key, value) in expr.items(): for (key, value) in expr.items():
if key not in required and key not in optional:
raise QAPISemError(info, "Unknown key '%s' in %s '%s'"
% (key, meta, name))
if key in ['gen', 'success-response'] and value is not False: if key in ['gen', 'success-response'] and value is not False:
raise QAPISemError(info, raise QAPISemError(info,
"'%s' of %s '%s' should only use false value" "'%s' of %s '%s' should only use false value"
@ -895,10 +905,6 @@ def check_keys(expr_elem, meta, required, optional=[]):
% (key, meta, name)) % (key, meta, name))
if key == 'if': if key == 'if':
check_if(expr, info) check_if(expr, info)
for key in required:
if key not in expr:
raise QAPISemError(info, "Key '%s' is missing from %s '%s'"
% (key, meta, name))
def check_exprs(exprs): def check_exprs(exprs):