| 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`") | |
| } | |
| } |