[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3 1/8] qapi: golang: Generate enum type
From: |
Markus Armbruster |
Subject: |
Re: [PATCH v3 1/8] qapi: golang: Generate enum type |
Date: |
Tue, 14 Jan 2025 09:52:23 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) |
Victor Toso <victortoso@redhat.com> writes:
> This patch handles QAPI enum types and generates its equivalent in Go.
> We sort the output based on enum's type name.
Any particular reason for sorting?
The existing backends generate output it source order, on the (bold?)
assumption that developers care to pick an order that makes sense.
> Enums are being handled as strings in Golang.
>
> 1. For each QAPI enum, we will define a string type in Go to be the
> assigned type of this specific enum.
>
> 2. Naming: CamelCase will be used in any identifier that we want to
> export, which is everything.
>
> Example:
>
> qapi:
> | ##
> | # @DisplayProtocol:
> | #
> | # Display protocols which support changing password options.
> | #
> | # Since: 7.0
> | ##
> | { 'enum': 'DisplayProtocol',
> | 'data': [ 'vnc', 'spice' ] }
>
> go:
> | // Display protocols which support changing password options.
> | //
> | // Since: 7.0
> | type DisplayProtocol string
> |
> | const (
> | DisplayProtocolVnc DisplayProtocol = "vnc"
> | DisplayProtocolSpice DisplayProtocol = "spice"
> | )
>
> Signed-off-by: Victor Toso <victortoso@redhat.com>
> ---
> scripts/qapi/golang.py | 266 +++++++++++++++++++++++++++++++++++++++++
> scripts/qapi/main.py | 3 +
> 2 files changed, 269 insertions(+)
> create mode 100644 scripts/qapi/golang.py
>
> diff --git a/scripts/qapi/golang.py b/scripts/qapi/golang.py
> new file mode 100644
> index 0000000000..1e04c99f1c
> --- /dev/null
> +++ b/scripts/qapi/golang.py
[...]
> +class QAPISchemaGenGolangVisitor(QAPISchemaVisitor):
[...]
> + def write(self, output_dir: str) -> None:
> + for module_name, content in self.target.items():
> + go_module = module_name + "s.go"
> + go_dir = "go"
> + pathname = os.path.join(output_dir, go_dir, go_module)
> + odir = os.path.dirname(pathname)
> + os.makedirs(odir, exist_ok=True)
> +
> + with open(pathname, "w", encoding="utf8") as outfile:
> + outfile.write(content)
Your write() serves the same purpose as QAPIGen.write(). The latter
touches output files only when their contents actually changes.
Have you considered use of QAPIGen?
The backends generating C use QAPISchemaMonolithicCVisitor or
QAPISchemaModularCVisitor, which use QAPIGenC, QAPIGenH and
QAPIGenTrace, all specializations of QAPIGen.
> diff --git a/scripts/qapi/main.py b/scripts/qapi/main.py
> index 316736b6a2..f1f813b466 100644
> --- a/scripts/qapi/main.py
> +++ b/scripts/qapi/main.py
> @@ -15,6 +15,7 @@
> from .common import must_match
> from .error import QAPIError
> from .events import gen_events
> +from .golang import gen_golang
> from .introspect import gen_introspect
> from .schema import QAPISchema
> from .types import gen_types
> @@ -54,6 +55,8 @@ def generate(schema_file: str,
> gen_events(schema, output_dir, prefix)
> gen_introspect(schema, output_dir, prefix, unmask)
>
> + gen_golang(schema, output_dir, prefix)
> +
>
> def main() -> int:
> """
- [PATCH v3 0/8] qapi-go: add generator for Golang interfaces, Victor Toso, 2025/01/10
- [PATCH v3 1/8] qapi: golang: Generate enum type, Victor Toso, 2025/01/10
- [PATCH v3 2/8] qapi: golang: Generate alternate types, Victor Toso, 2025/01/10
- [PATCH v3 3/8] qapi: golang: Generate struct types, Victor Toso, 2025/01/10
- [PATCH v3 4/8] qapi: golang: structs: Address nullable members, Victor Toso, 2025/01/10
- [PATCH v3 5/8] qapi: golang: Generate union type, Victor Toso, 2025/01/10
- [PATCH v3 6/8] qapi: golang: Generate event type, Victor Toso, 2025/01/10
- [PATCH v3 7/8] qapi: golang: Generate command type, Victor Toso, 2025/01/10