bindgen_helpers 0.5.1

Utilities to rename, change case, and fix Rust code generated by bindgen from C headers
Documentation
#![allow(clippy::needless_doctest_main)]
#![doc = include_str!("../README.md")]

pub use bindgen::*;
pub use convert_case::Case;
pub use regex::Regex;

mod renamer;
pub use renamer::*;

/// Macro to help define renaming rules for an enum and its values.
/// See an example in the [`Renamer`] documentation.
#[macro_export]
macro_rules! rename_enum {
    ( $cb:expr,
      $c_name:literal => $rust_name:literal
      $(, remove: $remove:literal)*
      $(, case: $case:ident)?
      $(, $itm:literal => $ren:literal)*
      $(,)?
    ) => {
        $cb.rename_item($c_name, $rust_name);
        #[allow(clippy::needless_update)]
        $cb.rename_enum_val(
            // See https://github.com/rust-lang/rust-bindgen/issues/3113#issuecomment-2844178132
            Some(concat!("^(enum )?", $c_name, "$")),
            $crate::IdentRenamer {
                remove: {
                    let patterns: Vec<&str> = vec![$($remove),*];
                    if patterns.is_empty() {
                        None
                    } else {
                        Some(
                            patterns
                                .into_iter()
                                .map(|v| $crate::Regex::new(v).expect("Unable to compile regex for remove parameter"))
                                .collect()
                        )
                    }
                },
                $( case: Some($crate::Case::$case), )?
                renames: vec![$( ($itm.into(), $ren.into()), )*].into_iter().collect(),
                ..$crate::IdentRenamer::default_case($crate::Case::Pascal)
            }
        );
    };
}