bindgen_helpers

Crates.iobindgen_helpers
lib.rsbindgen_helpers
version0.2.0
sourcesrc
created_at2024-11-02 04:52:31.646993
updated_at2024-11-10 22:26:30.594723
descriptionUtilities to rename, change case, and fix Rust code generated by bindgen from C headers
homepage
repositoryhttps://github.com/nyurik/bindgen_helpers
max_upload_size
id1432618
size29,980
Yuri Astrakhan (nyurik)

documentation

README

Rust bindgen helpers

GitHub crates.io version docs.rs crates.io license CI build

Utilities to rename, change case, and fix Rust code generated from the C headers using bindgen. Renamer implements a bindgen callback trait, and currently handles struct/enum/typedef type renames with a string->string hashmap. Additionally, it can rename the enum variant names by removing regex matches, and change identifier case to PascalCase to be consistent with the Rust canonical style.

Usage

// build.rs
use bindgen::Builder;
use bindgen_helpers::{rename_enum, Renamer};

fn main() {
  // true to enable debug output as warnings
  let mut renamer = Renamer::new(true);
  
  // rename a single item, e.g. a struct, enum, or a typedef
  renamer.rename_item("my_struct", "MyStruct");
  
  // rename an enum and its values
  rename_enum!(
    renamer,
    "my_enum" => "MyEnum", // rename the enum itself
    remove: "^I_SAID_",    // optionally any number of "remove" regexes
    remove: "_ENUM$",
    case: Pascal,          // optionally set case convert, defaults to "PascalCase"
    "MV_IT" => "Value1",   // rename a specific value after pattern removal
    "MV_IT2" => "Value2",  // more specific value renames
  );

  let bindings = Builder::default()
    // in real code, use .header("path/to/header.h")
    .header_contents("test.h", r#"

struct my_struct {
    int a;
};

enum my_enum {
	I_SAID_YES_ENUM,
	I_SAID_NO_ENUM,
	I_SAID_MV_IT_ENUM,
	I_SAID_MV_IT2_ENUM,
};

"#)
    // note that generated regex str includes all the renames, not just enums
    .rustified_enum(renamer.get_regex_str())
    .parse_callbacks(Box::new(renamer))
    .generate().unwrap();
}

//
// This is the approximate code that would be generated by the above:
//

#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct MyStruct {
  pub a: ::std::os::raw::c_int,
}

#[repr(u32)]
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
pub enum MyEnum {
  Yes = 0,
  No = 1,
  Value1 = 2,
  Value2 = 3,
}

See the list of all case variants supported by the convert_case crate.

Development

  • This project is easier to develop with just, a modern alternative to make. Install it with cargo install just.
  • To get a list of available commands, run just.
  • To run tests, use just test.
  • On git push, it will run a few validations, including cargo fmt, cargo clippy, and cargo test. Use git push --no-verify to skip these checks.

License

Licensed under either of

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 12

cargo fmt