On 12/9/25 11:03, Markus Armbruster wrote:
* Why is util::qobject::QObject needed?

* NONE is an error value, not a valid QType.  Having such error values
   in enums isn't unusual in C.  What about idiomatic Rust?  Even if it's
   unusual there, we may elect to do it anyway, just to keep generated
   Rust closer to C.  But it should be a conscious decision, not a blind
   port from C to Rust.

For QType we don't need to keep it closer, but actually ABI-compatible: QType is defined by QAPI but is used (almost exclusively) by QObject. We use the C version in the QObject bindings, for example:

                $($crate::bindings::QTYPE_QNULL => break $unit,)?

* "Default for QType" is NONE.  In C, it's zero bytes, which boils down
   to QTYPE_NONE.

* QTYPE__MAX is a bit of a headache in C.  It's not a valid enum value.
   We make it one only because we need to know the largest valid enum
   value, e.g. to size arrays, and the easiest way to get that value is
   adding an invalid one to the enum.  Same for all the other generated
   enums.  Could we avoid it in Rust?

Yes, I think so.

* C has a file comment of the form

     /*
      * One-line description of the file's purpose
      *
      * Copyright lines
      *
      * License blurb
      */

   I think Rust could use such a comment, too.

Ok.

* C has built-in types like QType in qapi-builtin-types.h, generated
   only with -b.  This is a somewhat crude way to let code generated for
   multiple schemas coexist: pass -b for exactly one of them.  If we
   generated code for built-in types unconditionally into qapi-types.h,
   the C compiler would choke on duplicate definitions.  Why is this not
   a problem with Rust?

Because there's better namespacing, so it's okay to define the builtin types in more than one place. However, do we need at all the builtin types in Rust? QType is only defined in QAPI to have the nice enum lookup tables, and we can get it via FFI bindings. Lists, as you say below, are not needed, and they are also a part of qapi-builtin-types.h.

So I think Rust does not need built-in types at all, which I think solves all your problems here (other than _MAX which can be removed).


* The Rust version doesn't have deallocation boilerplate.  Deallocation
   just works there, I guess.

* The Rust version doesn't have the List type.  Lists just work there, I
   guess.

Yep.

* The Rust version doesn't have the implicit type q_obj_my_command_arg,
   which is the arguments of my-command as a struct type.  C needs it for
   marshaling / unmarshaling with visitors.  Rust doesn't, because we use
   serde.  Correct?

Commands are not supported at all yet.

Paolo


Reply via email to