book/src/code-formatting.md
bindgen uses rustfmt to format the emitted bindings. This section describes
how to adjust the rustfmt behavior when being used from bindgen.
rustfmt.toml configuration filerustfmt should automatically use any rustfmt.toml file that is present in
the directory from where bindgen will be run. If you want to use a
configuration file that has a different name or that is in a different
directory you can use the --rustfmt-configuration-file flag or the
Builder::rustfmt_configuration_file
method.
rustfmtIf the rustfmt command does not correspond to a nightly release of rustfmt
but you have rustup available, you can use nightly by following these
steps:
bindgen as a CLI applicationUse rustup run to run bindgen:
$ rustup run nightly bindgen [ARGS]
bindgen as a libraryTake the output of the following command:
$ rustup which rustfmt --toolchain=nightly
and pass it to
Builder::with_rustfmt:
use bindgen::Builder;
use std::process::Command;
fn main() {
let output = Command::new("rustup")
.args(["which", "rustfmt", "--toolchain", "nightly"])
.output()
.expect("Could not spawn `rustup` command");
assert!(
output.status.success(),
"Unsuccessful status code when running `rustup`: {output:?}",
);
let rustfmt_path =
String::from_utf8(output.stdout).expect("The `rustfmt` path is not valid `utf-8`");
let bindings = Builder::default()
.header("path/to/input.h")
.with_rustfmt(rustfmt_path)
.generate()
.expect("Could not generate bindings");
bindings
.write_to_file("path/to/output.rs")
.expect("Could not write bindings");
}
These two methods also apply to any other toolchain available in your system.
prettypleaseThe prettyplease crate is a
minimal formatter for generated code. To format bindings using prettyplease
you have to invoke bindgen with either the --formatter=prettyplease flag or
the bindgen::Builder::formatter(bindgen::Formatter::Prettyplease). One of
its advantages is that prettyplease can be used in minimal environments where
the Rust toolchain is not installed.
#[doc] attributes?bindgen emits all the documentation using #[doc] attributes by default. If
you want to use the more user-friendly /// syntax, you have two options:
rustfmtrustfmt can be configured to normalize documentation. To do so, you have to
create a rustfmt.toml file with the following contents:
normalize_doc_attributes = true
Then, you have set up bindgen so it passes this file to rustfmt. Given that
the normalize_doc_attributes option is
unstable, you also have to
set up bindgen to use a nightly release of rustfmt.
prettypleaseprettyplease normalizes documentation without any additional configuration.
Then you just have to tell bindgen to use prettyplease as the code
formatter.