Skip to content

Commit fdd49ef

Browse files
committed
Add option to generate safe and unsafe conversions for rustified enums
1 parent bd67942 commit fdd49ef

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+1090
-141
lines changed

bindgen-cli/options.rs

+24-14
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use bindgen::callbacks::TypeKind;
22
use bindgen::{
33
builder, Abi, AliasVariation, Builder, CodegenConfig, EnumVariation,
44
FieldVisibilityKind, Formatter, MacroTypeVariation, NonCopyUnionStyle,
5-
RegexSet, RustTarget, DEFAULT_ANON_FIELDS_PREFIX, RUST_TARGET_STRINGS,
5+
RegexSet, RustEnumOptions, RustTarget, DEFAULT_ANON_FIELDS_PREFIX,
6+
RUST_TARGET_STRINGS,
67
};
78
use clap::error::{Error, ErrorKind};
89
use clap::{CommandFactory, Parser};
@@ -75,6 +76,21 @@ fn parse_abi_override(abi_override: &str) -> Result<(Abi, String), Error> {
7576
Ok((abi, regex.to_owned()))
7677
}
7778

79+
fn parse_rustified_enum(
80+
rustified_enum: &str,
81+
) -> Result<(RustEnumOptions, String), Error> {
82+
let (regex, options) = match rustified_enum.rsplit_once('=') {
83+
Some((regex, options)) => (regex, options),
84+
None => (rustified_enum, ""),
85+
};
86+
87+
let options = options
88+
.parse()
89+
.map_err(|err| Error::raw(ErrorKind::InvalidValue, err))?;
90+
91+
Ok((options, regex.to_owned()))
92+
}
93+
7894
fn parse_custom_derive(
7995
custom_derive: &str,
8096
) -> Result<(Vec<String>, String), Error> {
@@ -111,12 +127,11 @@ struct BindgenCommand {
111127
/// Mark any enum whose name matches REGEX as a global newtype.
112128
#[arg(long, value_name = "REGEX")]
113129
newtype_global_enum: Vec<String>,
114-
/// Mark any enum whose name matches REGEX as a Rust enum.
115-
#[arg(long, value_name = "REGEX")]
116-
rustified_enum: Vec<String>,
117-
/// Mark any enum whose name matches REGEX as a non-exhaustive Rust enum.
118-
#[arg(long, value_name = "REGEX")]
119-
rustified_non_exhaustive_enum: Vec<String>,
130+
/// Mark any enum whose name matches the provided regex as a Rust enum. This parameter takes
131+
/// options in the shape REGEX or REGEX=OPTIONS where OPTIONS can be a comma separated list of
132+
/// options from non_exhaustive, try_from_raw, and from_raw_unchecked.
133+
#[arg(long, value_parser = parse_rustified_enum)]
134+
rustified_enum: Vec<(RustEnumOptions, String)>,
120135
/// Mark any enum whose name matches REGEX as a series of constants.
121136
#[arg(long, value_name = "REGEX")]
122137
constified_enum: Vec<String>,
@@ -472,7 +487,6 @@ where
472487
newtype_enum,
473488
newtype_global_enum,
474489
rustified_enum,
475-
rustified_non_exhaustive_enum,
476490
constified_enum,
477491
constified_enum_module,
478492
default_macro_constant_type,
@@ -635,12 +649,8 @@ where
635649
builder = builder.newtype_global_enum(regex);
636650
}
637651

638-
for regex in rustified_enum {
639-
builder = builder.rustified_enum(regex);
640-
}
641-
642-
for regex in rustified_non_exhaustive_enum {
643-
builder = builder.rustified_non_exhaustive_enum(regex);
652+
for (options, regex) in rustified_enum {
653+
builder = builder.rustified_enum(options, regex);
644654
}
645655

646656
for regex in constified_enum {

bindgen-integration/build.rs

+2
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,8 @@ fn setup_macro_test() {
180180
.enable_cxx_namespaces()
181181
.default_enum_style(EnumVariation::Rust {
182182
non_exhaustive: false,
183+
safe_conversion: false,
184+
unsafe_conversion: false,
183185
})
184186
.raw_line("pub use self::root::*;")
185187
.raw_line("extern { fn my_prefixed_function_to_remove(i: i32); }")

bindgen-tests/tests/expectations/tests/anon_enum.rs

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/anon_enum_allowlist.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/anon_enum_trait.rs

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/anon_union.rs

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/anon_union_1_0.rs

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/bitfield_align_2.rs

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/class_with_inner_struct.rs

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/class_with_inner_struct_1_0.rs

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/const_enum_unnamed.rs

+5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/constant-evaluate.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/constify-enum.rs

+7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/derive-custom-cli.rs

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/dupe-enum-variant-in-namespace.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/empty-enum.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum-default-rust.rs

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum-doc-rusty.rs

+16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum-no-debug-rust.rs

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum-undefault.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum_alias.rs

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

bindgen-tests/tests/expectations/tests/enum_and_vtable_mangling.rs

+3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)