[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 05/30] rust: qemu_api_macros: make pattern matching more readable
From: |
Paolo Bonzini |
Subject: |
[PULL 05/30] rust: qemu_api_macros: make pattern matching more readable and efficient |
Date: |
Tue, 6 May 2025 17:29:00 +0200 |
"let ... else" is useful when visiting syntax trees; it avoids multiple
levels of indentation and places the error close to the pattern.
While at it, use "ref" to avoid moving the syntax tree objects.
Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
rust/qemu-api-macros/src/lib.rs | 84 +++++++++++++++------------------
1 file changed, 37 insertions(+), 47 deletions(-)
diff --git a/rust/qemu-api-macros/src/lib.rs b/rust/qemu-api-macros/src/lib.rs
index eda0d46d122..0bffd2691b4 100644
--- a/rust/qemu-api-macros/src/lib.rs
+++ b/rust/qemu-api-macros/src/lib.rs
@@ -16,50 +16,41 @@ fn get_fields<'a>(
input: &'a DeriveInput,
msg: &str,
) -> Result<&'a Punctuated<Field, Comma>, MacroError> {
- if let Data::Struct(s) = &input.data {
- if let Fields::Named(fs) = &s.fields {
- Ok(&fs.named)
- } else {
- Err(MacroError::Message(
- format!("Named fields required for {}", msg),
- input.ident.span(),
- ))
- }
- } else {
- Err(MacroError::Message(
+ let Data::Struct(ref s) = &input.data else {
+ return Err(MacroError::Message(
format!("Struct required for {}", msg),
input.ident.span(),
- ))
- }
+ ));
+ };
+ let Fields::Named(ref fs) = &s.fields else {
+ return Err(MacroError::Message(
+ format!("Named fields required for {}", msg),
+ input.ident.span(),
+ ));
+ };
+ Ok(&fs.named)
}
fn get_unnamed_field<'a>(input: &'a DeriveInput, msg: &str) -> Result<&'a
Field, MacroError> {
- if let Data::Struct(s) = &input.data {
- let unnamed = match &s.fields {
- Fields::Unnamed(FieldsUnnamed {
- unnamed: ref fields,
- ..
- }) => fields,
- _ => {
- return Err(MacroError::Message(
- format!("Tuple struct required for {}", msg),
- s.fields.span(),
- ))
- }
- };
- if unnamed.len() != 1 {
- return Err(MacroError::Message(
- format!("A single field is required for {}", msg),
- s.fields.span(),
- ));
- }
- Ok(&unnamed[0])
- } else {
- Err(MacroError::Message(
+ let Data::Struct(ref s) = &input.data else {
+ return Err(MacroError::Message(
format!("Struct required for {}", msg),
input.ident.span(),
- ))
+ ));
+ };
+ let Fields::Unnamed(FieldsUnnamed { ref unnamed, .. }) = &s.fields else {
+ return Err(MacroError::Message(
+ format!("Tuple struct required for {}", msg),
+ s.fields.span(),
+ ));
+ };
+ if unnamed.len() != 1 {
+ return Err(MacroError::Message(
+ format!("A single field is required for {}", msg),
+ s.fields.span(),
+ ));
}
+ Ok(&unnamed[0])
}
fn is_c_repr(input: &DeriveInput, msg: &str) -> Result<(), MacroError> {
@@ -210,20 +201,19 @@ fn get_repr_uN(input: &DeriveInput, msg: &str) ->
Result<Path, MacroError> {
}
fn get_variants(input: &DeriveInput) -> Result<&Punctuated<Variant, Comma>,
MacroError> {
- if let Data::Enum(e) = &input.data {
- if let Some(v) = e.variants.iter().find(|v| v.fields != Fields::Unit) {
- return Err(MacroError::Message(
- "Cannot derive TryInto for enum with non-unit
variants.".to_string(),
- v.fields.span(),
- ));
- }
- Ok(&e.variants)
- } else {
- Err(MacroError::Message(
+ let Data::Enum(ref e) = &input.data else {
+ return Err(MacroError::Message(
"Cannot derive TryInto for union or struct.".to_string(),
input.ident.span(),
- ))
+ ));
+ };
+ if let Some(v) = e.variants.iter().find(|v| v.fields != Fields::Unit) {
+ return Err(MacroError::Message(
+ "Cannot derive TryInto for enum with non-unit
variants.".to_string(),
+ v.fields.span(),
+ ));
}
+ Ok(&e.variants)
}
#[rustfmt::skip::macros(quote)]
--
2.49.0
- [PULL 00/30] Rust, wasm changes for 2025-05-06, Paolo Bonzini, 2025/05/06
- [PULL 03/30] rust: use std::ffi instead of std::os::raw, Paolo Bonzini, 2025/05/06
- [PULL 02/30] meson, cargo: require Rust 1.77.0, Paolo Bonzini, 2025/05/06
- [PULL 01/30] lcitool: use newer Rust for Debian and Ubuntu, Paolo Bonzini, 2025/05/06
- [PULL 04/30] rust: let bilge use "let ... else", Paolo Bonzini, 2025/05/06
- [PULL 05/30] rust: qemu_api_macros: make pattern matching more readable and efficient,
Paolo Bonzini <=
- [PULL 06/30] rust: use MaybeUninit::zeroed() in const context, Paolo Bonzini, 2025/05/06
- [PULL 07/30] rust: qom: fix TODO about zeroability of classes, Paolo Bonzini, 2025/05/06
- [PULL 08/30] rust: enable clippy::ptr_cast_constness, Paolo Bonzini, 2025/05/06
- [PULL 10/30] rust: replace c_str! with c"" literals, Paolo Bonzini, 2025/05/06
- [PULL 09/30] rust: remove offset_of replacement, Paolo Bonzini, 2025/05/06
- [PULL 16/30] target/arm/helper.c: Fix type conflict of GLib function pointers, Paolo Bonzini, 2025/05/06
- [PULL 11/30] docs: rust: update for newer minimum supported version, Paolo Bonzini, 2025/05/06
- [PULL 14/30] ci: run RISC-V cross jobs by default, Paolo Bonzini, 2025/05/06
- [PULL 13/30] rust: clippy: enable uninlined_format_args lint, Paolo Bonzini, 2025/05/06
- [PULL 15/30] docs: build-system: fix typo, Paolo Bonzini, 2025/05/06