| """ |
| QAPI features generator |
| |
| Copyright 2024 Red Hat |
| |
| This work is licensed under the terms of the GNU GPL, version 2. |
| # See the COPYING file in the top-level directory. |
| """ |
| |
| from typing import ValuesView |
| |
| from .common import c_enum_const, c_name |
| from .gen import QAPISchemaMonolithicCVisitor |
| from .schema import QAPISchema, QAPISchemaFeature |
| |
| |
| class QAPISchemaGenFeatureVisitor(QAPISchemaMonolithicCVisitor): |
| |
| def __init__(self, prefix: str): |
| super().__init__( |
| prefix, 'qapi-features', |
| ' * Schema-defined QAPI features', |
| __doc__) |
| |
| self.features: ValuesView[QAPISchemaFeature] |
| |
| def visit_begin(self, schema: QAPISchema) -> None: |
| self.features = schema.features() |
| self._genh.add("#include \"qapi/util.h\"\n\n") |
| |
| def visit_end(self) -> None: |
| self._genh.add("typedef enum {\n") |
| for f in self.features: |
| self._genh.add(f" {c_enum_const('qapi_feature', f.name)}") |
| if f.name in QAPISchemaFeature.SPECIAL_NAMES: |
| self._genh.add(f" = {c_enum_const('qapi', f.name)},\n") |
| else: |
| self._genh.add(",\n") |
| |
| self._genh.add("} " + c_name('QapiFeature') + ";\n") |
| |
| |
| def gen_features(schema: QAPISchema, |
| output_dir: str, |
| prefix: str) -> None: |
| vis = QAPISchemaGenFeatureVisitor(prefix) |
| schema.visit(vis) |
| vis.write(output_dir) |