1*2ebb09f3SDaniel P. Berrangé""" 2*2ebb09f3SDaniel P. BerrangéQAPI features generator 3*2ebb09f3SDaniel P. Berrangé 4*2ebb09f3SDaniel P. BerrangéCopyright 2024 Red Hat 5*2ebb09f3SDaniel P. Berrangé 6*2ebb09f3SDaniel P. BerrangéThis work is licensed under the terms of the GNU GPL, version 2. 7*2ebb09f3SDaniel P. Berrangé# See the COPYING file in the top-level directory. 8*2ebb09f3SDaniel P. Berrangé""" 9*2ebb09f3SDaniel P. Berrangé 10*2ebb09f3SDaniel P. Berrangéfrom typing import ValuesView 11*2ebb09f3SDaniel P. Berrangé 12*2ebb09f3SDaniel P. Berrangéfrom .common import c_enum_const, c_name 13*2ebb09f3SDaniel P. Berrangéfrom .gen import QAPISchemaMonolithicCVisitor 14*2ebb09f3SDaniel P. Berrangéfrom .schema import QAPISchema, QAPISchemaFeature 15*2ebb09f3SDaniel P. Berrangé 16*2ebb09f3SDaniel P. Berrangé 17*2ebb09f3SDaniel P. Berrangéclass QAPISchemaGenFeatureVisitor(QAPISchemaMonolithicCVisitor): 18*2ebb09f3SDaniel P. Berrangé 19*2ebb09f3SDaniel P. Berrangé def __init__(self, prefix: str): 20*2ebb09f3SDaniel P. Berrangé super().__init__( 21*2ebb09f3SDaniel P. Berrangé prefix, 'qapi-features', 22*2ebb09f3SDaniel P. Berrangé ' * Schema-defined QAPI features', 23*2ebb09f3SDaniel P. Berrangé __doc__) 24*2ebb09f3SDaniel P. Berrangé 25*2ebb09f3SDaniel P. Berrangé self.features: ValuesView[QAPISchemaFeature] 26*2ebb09f3SDaniel P. Berrangé 27*2ebb09f3SDaniel P. Berrangé def visit_begin(self, schema: QAPISchema) -> None: 28*2ebb09f3SDaniel P. Berrangé self.features = schema.features() 29*2ebb09f3SDaniel P. Berrangé self._genh.add("#include \"qapi/util.h\"\n\n") 30*2ebb09f3SDaniel P. Berrangé 31*2ebb09f3SDaniel P. Berrangé def visit_end(self) -> None: 32*2ebb09f3SDaniel P. Berrangé self._genh.add("typedef enum {\n") 33*2ebb09f3SDaniel P. Berrangé for f in self.features: 34*2ebb09f3SDaniel P. Berrangé self._genh.add(f" {c_enum_const('qapi_feature', f.name)}") 35*2ebb09f3SDaniel P. Berrangé if f.name in QAPISchemaFeature.SPECIAL_NAMES: 36*2ebb09f3SDaniel P. Berrangé self._genh.add(f" = {c_enum_const('qapi', f.name)},\n") 37*2ebb09f3SDaniel P. Berrangé else: 38*2ebb09f3SDaniel P. Berrangé self._genh.add(",\n") 39*2ebb09f3SDaniel P. Berrangé 40*2ebb09f3SDaniel P. Berrangé self._genh.add("} " + c_name('QapiFeature') + ";\n") 41*2ebb09f3SDaniel P. Berrangé 42*2ebb09f3SDaniel P. Berrangé 43*2ebb09f3SDaniel P. Berrangédef gen_features(schema: QAPISchema, 44*2ebb09f3SDaniel P. Berrangé output_dir: str, 45*2ebb09f3SDaniel P. Berrangé prefix: str) -> None: 46*2ebb09f3SDaniel P. Berrangé vis = QAPISchemaGenFeatureVisitor(prefix) 47*2ebb09f3SDaniel P. Berrangé schema.visit(vis) 48*2ebb09f3SDaniel P. Berrangé vis.write(output_dir) 49