198626572SMarkus Armbruster# 298626572SMarkus Armbruster# QAPI parser test harness 398626572SMarkus Armbruster# 498626572SMarkus Armbruster# Copyright (c) 2013 Red Hat Inc. 598626572SMarkus Armbruster# 698626572SMarkus Armbruster# Authors: 798626572SMarkus Armbruster# Markus Armbruster <armbru@redhat.com> 898626572SMarkus Armbruster# 998626572SMarkus Armbruster# This work is licensed under the terms of the GNU GPL, version 2 or later. 1098626572SMarkus Armbruster# See the COPYING file in the top-level directory. 1198626572SMarkus Armbruster# 1298626572SMarkus Armbruster 13ef9d9108SDaniel P. Berrangefrom __future__ import print_function 1498626572SMarkus Armbrusterimport sys 15181feaf3SMarkus Armbrusterfrom qapi.common import QAPIError, QAPISchema, QAPISchemaVisitor 1698626572SMarkus Armbruster 1798626572SMarkus Armbruster 18156402e5SMarkus Armbrusterclass QAPISchemaTestVisitor(QAPISchemaVisitor): 19cf40a0a5SMarkus Armbruster 20cf40a0a5SMarkus Armbruster def visit_module(self, name): 21cf40a0a5SMarkus Armbruster print('module %s' % name) 22cf40a0a5SMarkus Armbruster 23cf40a0a5SMarkus Armbruster def visit_include(self, name, info): 24cf40a0a5SMarkus Armbruster print('include %s' % name) 25cf40a0a5SMarkus Armbruster 261962bd39SMarc-André Lureau def visit_enum_type(self, name, info, ifcond, members, prefix): 271e381b65SMarc-André Lureau print('enum %s' % name) 28156402e5SMarkus Armbruster if prefix: 29ef9d9108SDaniel P. Berrange print(' prefix %s' % prefix) 301e381b65SMarc-André Lureau for m in members: 311e381b65SMarc-André Lureau print(' member %s' % m.name) 326cc32b0eSMarc-André Lureau self._print_if(m.ifcond, indent=8) 33fbf09a2fSMarc-André Lureau self._print_if(ifcond) 34156402e5SMarkus Armbruster 35ca0ac758SMarkus Armbruster def visit_array_type(self, name, info, ifcond, element_type): 36ca0ac758SMarkus Armbruster if not info: 37ca0ac758SMarkus Armbruster return # suppress built-in arrays 38ca0ac758SMarkus Armbruster print('array %s %s' % (name, element_type.name)) 39ca0ac758SMarkus Armbruster self._print_if(ifcond) 40ca0ac758SMarkus Armbruster 41*6a8c0b51SKevin Wolf def visit_object_type(self, name, info, ifcond, base, members, variants, 42*6a8c0b51SKevin Wolf features): 43ef9d9108SDaniel P. Berrange print('object %s' % name) 44156402e5SMarkus Armbruster if base: 45ef9d9108SDaniel P. Berrange print(' base %s' % base.name) 46156402e5SMarkus Armbruster for m in members: 47b736e25aSMarkus Armbruster print(' member %s: %s optional=%s' 48b736e25aSMarkus Armbruster % (m.name, m.type.name, m.optional)) 49ccadd6bcSMarc-André Lureau self._print_if(m.ifcond, 8) 50156402e5SMarkus Armbruster self._print_variants(variants) 51fbf09a2fSMarc-André Lureau self._print_if(ifcond) 52156402e5SMarkus Armbruster 53fbf09a2fSMarc-André Lureau def visit_alternate_type(self, name, info, ifcond, variants): 54ef9d9108SDaniel P. Berrange print('alternate %s' % name) 55156402e5SMarkus Armbruster self._print_variants(variants) 56fbf09a2fSMarc-André Lureau self._print_if(ifcond) 57156402e5SMarkus Armbruster 58fbf09a2fSMarc-André Lureau def visit_command(self, name, info, ifcond, arg_type, ret_type, gen, 59d6fe3d02SIgor Mammedov success_response, boxed, allow_oob, allow_preconfig): 60b736e25aSMarkus Armbruster print('command %s %s -> %s' 61b736e25aSMarkus Armbruster % (name, arg_type and arg_type.name, 62b736e25aSMarkus Armbruster ret_type and ret_type.name)) 63b736e25aSMarkus Armbruster print(' gen=%s success_response=%s boxed=%s oob=%s preconfig=%s' 64b736e25aSMarkus Armbruster % (gen, success_response, boxed, allow_oob, allow_preconfig)) 65fbf09a2fSMarc-André Lureau self._print_if(ifcond) 66156402e5SMarkus Armbruster 67fbf09a2fSMarc-André Lureau def visit_event(self, name, info, ifcond, arg_type, boxed): 68ef9d9108SDaniel P. Berrange print('event %s %s' % (name, arg_type and arg_type.name)) 69ef9d9108SDaniel P. Berrange print(' boxed=%s' % boxed) 70fbf09a2fSMarc-André Lureau self._print_if(ifcond) 71156402e5SMarkus Armbruster 72156402e5SMarkus Armbruster @staticmethod 73156402e5SMarkus Armbruster def _print_variants(variants): 74156402e5SMarkus Armbruster if variants: 75ef9d9108SDaniel P. Berrange print(' tag %s' % variants.tag_member.name) 76156402e5SMarkus Armbruster for v in variants.variants: 77ef9d9108SDaniel P. Berrange print(' case %s: %s' % (v.name, v.type.name)) 78a2724280SMarc-André Lureau QAPISchemaTestVisitor._print_if(v.ifcond, indent=8) 79156402e5SMarkus Armbruster 80fbf09a2fSMarc-André Lureau @staticmethod 81fbf09a2fSMarc-André Lureau def _print_if(ifcond, indent=4): 82fbf09a2fSMarc-André Lureau if ifcond: 83fbf09a2fSMarc-André Lureau print('%sif %s' % (' ' * indent, ifcond)) 84fbf09a2fSMarc-André Lureau 85181feaf3SMarkus Armbruster 86181feaf3SMarkus Armbrustertry: 87156402e5SMarkus Armbruster schema = QAPISchema(sys.argv[1]) 88181feaf3SMarkus Armbrusterexcept QAPIError as err: 89181feaf3SMarkus Armbruster print(err, file=sys.stderr) 90181feaf3SMarkus Armbruster exit(1) 91181feaf3SMarkus Armbruster 92156402e5SMarkus Armbrusterschema.visit(QAPISchemaTestVisitor()) 93818c3318SMarkus Armbruster 94818c3318SMarkus Armbrusterfor doc in schema.docs: 95818c3318SMarkus Armbruster if doc.symbol: 96ef9d9108SDaniel P. Berrange print('doc symbol=%s' % doc.symbol) 97818c3318SMarkus Armbruster else: 98ef9d9108SDaniel P. Berrange print('doc freeform') 99ef9d9108SDaniel P. Berrange print(' body=\n%s' % doc.body.text) 1002f848044SDaniel P. Berrange for arg, section in doc.args.items(): 101ef9d9108SDaniel P. Berrange print(' arg=%s\n%s' % (arg, section.text)) 102818c3318SMarkus Armbruster for section in doc.sections: 103ef9d9108SDaniel P. Berrange print(' section=%s\n%s' % (section.name, section.text)) 104