From: Markus Armbruster <armbru@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: "Markus Armbruster" <armbru@redhat.com>,
qemu-devel@nongnu.org,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
qemu-rust@nongnu.org
Subject: Re: [PATCH v2 12/16] scripts/qapi: generate high-level Rust bindings
Date: Tue, 03 Mar 2026 13:31:21 +0100 [thread overview]
Message-ID: <87v7fdm6w6.fsf@pond.sub.org> (raw)
In-Reply-To: <3cd5ac78-1833-4671-a866-60a57f29c3c1@redhat.com> (Paolo Bonzini's message of "Tue, 3 Mar 2026 11:00:42 +0100")
Paolo Bonzini <pbonzini@redhat.com> writes:
> On 2/25/26 15:39, Markus Armbruster wrote:
>>> +def rs_name(name: str) -> str:
>>> + """
>>> + Map @name to a valid, possibly raw Rust identifier.
>>> + """
>>> + name = re.sub(r'[^A-Za-z0-9_]', '_', name)
>>> + if name[0].isnumeric():
>>
>> .isdigit()? It's what c_name() uses...
>>
>>> + name = '_' + name
>>
>> In review of v1, I pointed to "The Rust Reference"
>>
>> Identifiers starting with an underscore are typically used to
>> indicate an identifier that is intentionally unused, and will
>> silence the unused warning in rustc.
>>
>> https://doc.rust-lang.org/reference/identifiers.html
>>
>> You replied "In this case it doesn't really matter: public items (such
>> as QAPI enum entries, or struct fields) do not raise the unused warning
>> anyway."
>>
>> What gives us confidence rs_name() will only be used where it doesn't
>> really matter?
>
> The fact that all QAPI type definitions are (more or less by design) public.
Any particular reason not to use the same 'q_' prefix as in C?
>>> + # avoid some clashes with the standard library
>>> + if name in ('String',):
>>> + name = 'Qapi' + name
>>
>> This hides the unwise use of 'String' in qapi/net.json from Rust. I'd
>> rather rename that one.
>
> Ok, BoxedString?
Works for me.
>>> +
>>> + return name
>>> +
>>> +
>>> +def to_camel_case(value: str) -> str:
>>> + return ''.join('_' + word if word[0].isdigit()
>>> + else word[:1].upper() + word[1:]
>>> + for word in filter(None, re.split("[-_]+", value)))
>>
>> Please use r'...' for regular expressions always.
>>
>> Why do you need filter()?
>
> To handle - or _ at the beginning or ending of a string, where an empty
> string would cause an IndexError in word[0].isdigit().
Got it, thanks.
>> This maps 'foo-0123-bar' to 'Foo_0123Bar'. Intentional? I'd kind of
>> expect 'Foo0123Bar'.
>
> Will fix (it is meant for 0123-45). New version is:
>
> def to_camel_case(value: str) -> str:
> result = ''
> for p in re.split(r'[-_]+', value):
> if not p:
> pass
> elif p[0].isalpha() or (result and result[-1].isalpha()):
> result += p[0].upper() + p[1:]
> else:
> result += '_' + p
> return result
Maps '0123-45' to '_0123_45'. Is the leading '_' intentional?
>>> +def mcgen(s: str, **kwds: object) -> str:
>>> + s = mcgen_common(s, **kwds)
>>> + return re.sub(r'(?: *\n)+', '\n', s)
>>
>> This eats trailing spaces and blank lines. The latter is a big hammer.
>> Without it, I see unwanted blank lines generated. With it, I see wanted
>> blank lines eaten. For instance:
>
> Ok, I can look into adding rstrip here and there.
>
>>> + except FileNotFoundError:
>>> + pass
>>
>> This runs rustfmt to clean up the generated file. Silently does nothing
>> if we don't have rustfmt.
>>
>> Should we make rustfmt a hard requirement? Please discuss this briefly
>> in the commit message.
I'm fine with not running rustfmt, and I'm fine with running it always
(makes it a hard requirement). Running it sometimes feels like more
trouble than it's worth.
> It's unnecessary, but it does make the output look nicer. If I add
> rstrip, I don't need it.
>
>>> + # Return the Rust type for common use
>>
>> Are the uncommon uses?
>>
>> There are for C types, and that's why we have both .c_type(),
>> .c_param_type(), nad .c_unboxed_type().
>
> Yes, Box<> and Vec<>. They just don't deserve their own function unlike C.
I see.
next prev parent reply other threads:[~2026-03-03 12:31 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-08 13:10 [PATCH v2 00/16] rust: QObject and QAPI bindings Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 01/16] rust/qobject: add basic bindings Paolo Bonzini
2026-02-24 10:03 ` Markus Armbruster
2026-02-24 10:35 ` Paolo Bonzini
2026-02-24 13:33 ` Markus Armbruster
2026-02-25 8:05 ` Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 02/16] subprojects: add serde Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 03/16] rust/qobject: add Serialize implementation Paolo Bonzini
2026-02-24 10:29 ` Markus Armbruster
2026-02-24 10:48 ` Paolo Bonzini
2026-02-24 13:41 ` Markus Armbruster
2026-01-08 13:10 ` [PATCH v2 04/16] rust/qobject: add Serializer (to_qobject) implementation Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 05/16] rust/qobject: add Deserialize implementation Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 06/16] rust/qobject: add Deserializer (from_qobject) implementation Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 07/16] rust/qobject: add from/to JSON bindings for QObject Paolo Bonzini
2026-01-15 13:17 ` Zhao Liu
2026-01-08 13:10 ` [PATCH v2 08/16] rust/qobject: add Display/Debug Paolo Bonzini
2026-01-15 13:19 ` Zhao Liu
2026-01-08 13:10 ` [PATCH v2 09/16] scripts/qapi: add QAPISchemaIfCond.rsgen() Paolo Bonzini
2026-01-19 6:58 ` Zhao Liu
2026-02-25 6:48 ` Markus Armbruster
2026-02-25 7:53 ` Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 10/16] scripts/qapi: add QAPISchemaType.is_predefined Paolo Bonzini
2026-02-25 7:33 ` Markus Armbruster
2026-02-25 8:01 ` Paolo Bonzini
2026-02-25 8:44 ` Markus Armbruster
2026-02-26 14:12 ` Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 11/16] scripts/qapi: pull c_name from camel_to_upper to caller Paolo Bonzini
2026-01-19 7:05 ` Zhao Liu
2026-02-25 8:32 ` Markus Armbruster
2026-03-31 7:33 ` Paolo Bonzini
2026-03-31 7:37 ` Markus Armbruster
2026-01-08 13:10 ` [PATCH v2 12/16] scripts/qapi: generate high-level Rust bindings Paolo Bonzini
2026-02-23 12:36 ` Markus Armbruster
2026-02-23 16:11 ` Paolo Bonzini
2026-02-24 13:46 ` Markus Armbruster
2026-02-25 14:39 ` Markus Armbruster
2026-03-03 10:00 ` Paolo Bonzini
2026-03-03 12:31 ` Markus Armbruster [this message]
2026-03-03 15:55 ` Paolo Bonzini
2026-03-04 8:09 ` Markus Armbruster
2026-03-31 7:53 ` Paolo Bonzini
2026-05-06 10:59 ` Markus Armbruster
2026-05-06 12:35 ` Marc-André Lureau
2026-03-03 9:19 ` Markus Armbruster
2026-03-03 13:17 ` Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 13/16] scripts/rustc_args: add --no-strict-cfg Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 14/16] rust/util: build QAPI types Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 15/16] scripts/qapi: add serde attributes Paolo Bonzini
2026-01-08 13:10 ` [PATCH v2 16/16] rust/tests: QAPI integration tests Paolo Bonzini
2026-06-03 8:36 ` Marc-André Lureau
2026-02-17 8:10 ` [PATCH v2 00/16] rust: QObject and QAPI bindings Paolo Bonzini
2026-02-19 13:39 ` Markus Armbruster
2026-02-19 16:28 ` Paolo Bonzini
2026-02-23 9:53 ` Daniel P. Berrangé
2026-02-23 15:54 ` Paolo Bonzini
2026-02-23 16:24 ` Daniel P. Berrangé
2026-02-23 19:03 ` Paolo Bonzini
2026-02-24 14:06 ` Markus Armbruster
2026-02-24 17:28 ` Paolo Bonzini
2026-02-26 12:42 ` Markus Armbruster
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87v7fdm6w6.fsf@pond.sub.org \
--to=armbru@redhat.com \
--cc=marcandre.lureau@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-rust@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.