| use std::{ |
| env, |
| path::{Path, PathBuf}, |
| process::{Command, Stdio}, |
| }; |
| |
| fn project_root() -> PathBuf { |
| PathBuf::from( |
| env::var("CARGO_MANIFEST_DIR").unwrap_or_else(|_| env!("CARGO_MANIFEST_DIR").to_owned()), |
| ) |
| } |
| |
| fn run(cmd: &str, dir: impl AsRef<Path>) -> Result<(), ()> { |
| let mut args: Vec<_> = cmd.split_whitespace().collect(); |
| let bin = args.remove(0); |
| println!("> {}", cmd); |
| let output = Command::new(bin) |
| .args(args) |
| .current_dir(dir) |
| .stdin(Stdio::null()) |
| .stdout(Stdio::piped()) |
| .stderr(Stdio::inherit()) |
| .output() |
| .map_err(drop)?; |
| if output.status.success() { |
| Ok(()) |
| } else { |
| let stdout = String::from_utf8(output.stdout).map_err(drop)?; |
| print!("{}", stdout); |
| Err(()) |
| } |
| } |
| |
| #[test] |
| fn check_code_formatting() { |
| let dir = project_root(); |
| if run("rustfmt +stable --version", &dir).is_err() { |
| panic!( |
| "failed to run rustfmt from toolchain 'stable'; \ |
| please run `rustup component add rustfmt --toolchain stable` to install it.", |
| ); |
| } |
| if run("cargo +stable fmt -- --check", &dir).is_err() { |
| panic!("code is not properly formatted; please format the code by running `cargo fmt`") |
| } |
| } |