in bindings/rust/extended/generate/src/main.rs [24:117]
fn main() {
let out_dir = std::env::args().nth(1).expect("missing sys dir");
let out_dir = Path::new(&out_dir);
let functions = FunctionCallbacks::default();
gen_bindings(
"#include <s2n.h>",
&out_dir.join("lib"),
functions.with_feature(None),
)
.allowlist_type("s2n_.*")
.allowlist_function("s2n_.*")
.allowlist_var("s2n_.*")
.generate()
.unwrap()
.write_to_file(out_dir.join("src/api.rs"))
.unwrap();
write_feature_bindings(
out_dir.join("lib/tls/s2n_internal.h"),
"internal",
out_dir,
out_dir.join("src/features/internal.rs"),
functions.clone(),
);
write_feature_bindings(
out_dir.join("lib/tls/s2n_quic_support.h"),
"quic",
out_dir,
out_dir.join("src/features/quic.rs"),
functions.clone(),
);
// get all of the files in the unstable folder
let unstable_api = out_dir.join("lib/api/unstable");
let unstable_headers: Vec<(String, fs::DirEntry)> = fs::read_dir(unstable_api)
.expect("unable to iterate through files in unstable api folder")
.into_iter()
.map(|dir_entry| dir_entry.expect("failed to read header"))
.map(|dir_entry| {
(
dir_entry
.path()
.file_stem()
.unwrap()
.to_str()
.unwrap()
.to_owned(),
dir_entry,
)
})
.collect();
// write unstable bindings for them
for (header_name, header) in unstable_headers.iter() {
let feature_name = format!("unstable-{}", header_name);
write_feature_bindings(
header.path(),
&feature_name,
out_dir,
out_dir.join(format!("src/features/{}.rs", header_name)),
functions.clone(),
);
}
// generate a cargo.toml that defines the correct features
let mut features_definition_token = unstable_headers
.iter()
.map(|(header_name, _header)| format!("unstable-{header_name} = []"))
.collect::<Vec<String>>();
features_definition_token.sort();
let cargo_template = out_dir.join("templates/Cargo.template");
let cargo_template = read_to_string(cargo_template).expect("unable to read cargo template");
let cargo_toml = cargo_template.replace(FEATURE_TOKEN_PLACEHOLDER, &(features_definition_token.join("\n")));
fs::write(out_dir.join("Cargo.toml"), cargo_toml).unwrap();
// generate a features.rs that includes the correct modules
let features_module_token = unstable_headers
.iter()
.map(|(header_name, _header)| {
format!("conditional_module!({header_name}, \"unstable-{header_name}\");")
})
.collect::<Vec<String>>()
.join("\n");
let features_template = out_dir.join("templates/features.template");
let features_template = read_to_string(features_template).expect("unable to features template");
let features_rs = features_template.replace(FEATURE_TOKEN_PLACEHOLDER, &features_module_token);
std::fs::write(out_dir.join("src/features.rs"), features_rs).unwrap();
functions.tests(&out_dir.join("src/tests.rs")).unwrap();
gen_files(&out_dir.join("lib"), &out_dir.join("files.rs")).unwrap();
}