Hi again, This patch series intent is to introduce a generator that produces a Go module for Go applications to interact over QMP with QEMU.
Previous version (10 Jan 2025) https://lists.gnu.org/archive/html/qemu-devel/2025-01/msg01530.html The generated code was mostly tested using existing examples in the QAPI documentation, 192 instances that might have multiple QMP messages each. You can find the the tests and the generated code in my personal repo, main branch: https://gitlab.com/victortoso/qapi-go If you want to see the generated code from QEMU's master but per patch: https://gitlab.com/victortoso/qapi-go/-/commits/qapi-golang-v4-by-patch If you rather see the diff between v9.1.0, v9.2.0 and latest: https://gitlab.com/victortoso/qapi-go/-/commits/qapi-golang-v4-by-tags ################# # Changes in v4 # ################# 1. Daniel wrote a demo on top of v3 and proposed changes that would result in more interesting module to build on top: https://lists.gnu.org/archive/html/qemu-devel/2025-01/msg03052.html I've implemented all the suggestions that are relevant for this introductory series, they are: a. New struct type Message, that shall be used for a 1st level unmarshalling of the JSON message. b. Removal of Marshal/Unmarshal code in both Events and Comands, together with utility code that is not relevant anymore. c. Declaration of 3 new interfaces: i. Events ii. Commands iii. CommandsAsync 2. I've moved the code to a new folder: scripts/qapi/golang. This allowed me to move templates out of golang.py, keeping go related code self-contained in the new directory. 3. As mentioned in (2), created protocol.go and utils.go that are 100% hand generated Go code. Message mentioned in (1a) is under protocol.go 4. Defined license using SPDX-License-Identifier. a. Every Go source code written by hand is 100% MIT-0 b. Every Go source code generated is dual licensed as MIT-0 and GPL-2.0-or-later c. The binary code is expected to be MIT-0 only but not really relevant for this series. If you want more information, please check the thread: https://lists.gnu.org/archive/html/qemu-devel/2024-11/msg01621.html 5. I've renamed the generated files. a. Any type related file is now prefixed with "gen_type_" b. Any interface related file is prefixed as "gen_iface_" 6. Relevant changes were made to the doc but it is not complete. I plan that follow-up proposals would add to the documentation. 7. Improvements to the generator were made to. 8. Also worth to mention that resulting generated code does not have any diff with gofmt and goimport tools, as requested in the past. ################ # Expectations # ################ As is, this still is a PoC that works. I'd like to have the generated code included in QEMU's gitlab [0] in order to write library and tools on top. Initial version should be considered alpha. Moving to beta/stable would require functional libraries and tools, but this work needs to be merged before one commit to that. [0] https://lists.gnu.org/archive/html/qemu-devel/2023-09/msg07024.html ################## # Follow-up work # ################## When this is merged we would need to: 1. Create gitlab's repo 2. Add unit test and CI to new repos 3. Have first alpha relase/tag 4. Start working on top :) Thanks for the time looking at this. I appreciate it. Victor Toso (11): qapi: golang: first level unmarshalling type qapi: golang: Generate enum type qapi: golang: Generate alternate types qapi: golang: Generate struct types qapi: golang: structs: Address nullable members qapi: golang: Generate union type qapi: golang: Generate event type qapi: golang: Generate Event interface qapi: golang: Generate command type qapi: golang: Generate Command sync/async interfaces docs: add notes on Golang code generator docs/devel/index-build.rst | 1 + docs/devel/qapi-golang-code-gen.rst | 420 ++++++++ scripts/qapi/golang/__init__.py | 0 scripts/qapi/golang/golang.py | 1444 +++++++++++++++++++++++++++ scripts/qapi/golang/protocol.go | 48 + scripts/qapi/golang/utils.go | 38 + scripts/qapi/main.py | 2 + 7 files changed, 1953 insertions(+) create mode 100644 docs/devel/qapi-golang-code-gen.rst create mode 100644 scripts/qapi/golang/__init__.py create mode 100644 scripts/qapi/golang/golang.py create mode 100644 scripts/qapi/golang/protocol.go create mode 100644 scripts/qapi/golang/utils.go -- 2.48.1