Hello everyone, I've been interested in a zig plugin for a few weeks now, too : I gave it a try and the prototype is available here [1].
It is clearly missing a lot of features, but the general structure is there and I think that by now it is interesting (at least for the purpose of discussion !).
One can find :
- The plugin, of course, implemented in (ugly but easily modifiable) C++ in `src/plugin/`, that generates zig files from generation requests.
- A capnp zig module in `src/` and `src/capnp/ that contains the runtime code. Again, it is partial, but a lot of things are there already :
- Writing of structures, groups, enums, primitive types and lists
- Reading of structures, primitive types and lists.
- Compressor and Decompressor, implemented as Zig's reader and writer (there are tests for those, in tests.zig).
- Use-cases, in `examples/`, which I find interesting as they demonstrate how a user can use a StreamSource (for reading) and an Allocator (for writing).
- I think the best place to start exploring the code, if need be, is `examples/emitter.zig`. It writes a file that respects the primitive.capnp schema. (The unionmess.capnp one is still WIP).
Again, I don't know if any other implementation exist, but I'll continue to work on this version (not much in the next few months, though).
Still I'm totally interested in the discussion that might follow :)
For instance :
- How can one manage groups correctly ?
- Is the reader/writer approach for decompression a good idea or a bad idea ? I like the fact that it is quite composable with other kind of readers/writers.
- What do you think of the View/Stencil notation instead of Reader/Builder ? (which I find clearly nicer personally, but the downside of changing names is an obvious limitation).
About the remarks on a direct mapping to zig structs : I didn't try this approach ; my prototype is much more conventional in this regard, and you will simply find getters and setters (without keys as enums).
Hugo
PS : Hopefully I'm not necrobumping anything by replying here (otherwise I'm sorry). I saw this thread before going into my own implementation but still wanted to try things out before diving in the discussion.
PS : The ROADMAP.txt is not exactly up-to-date.