3 releases
new 0.1.2 | Nov 4, 2024 |
---|---|
0.1.1 | Nov 2, 2024 |
0.1.0 | Nov 2, 2024 |
#84 in FFI
231 downloads per month
16KB
216 lines
Rust bindgen helpers
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 prefix / suffix, 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
prefix: "I_SAID_", // optionally remove a prefix
suffix: "_ENUM", // optionally remove a suffix
case: Pascal, // optionally set case convert, defaults to "PascalCase"
"MV_IT" => "Value1", // rename a specific value after prefix/suffix 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 withcargo 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, includingcargo fmt
,cargo clippy
, andcargo test
. Usegit push --no-verify
to skip these checks.
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT) at your option.
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.
Dependencies
~8MB
~151K SLoC