clippy_test_runner/
main.rs

1//! This is a helper binary used to convert the raw clippy rustc rustc-diagnostics
2//! into pretty printed ansi-color diagnostics.
3
4use camino::Utf8PathBuf;
5use clap::Parser;
6
7#[derive(Parser, Debug)]
8#[command(version, about, long_about = None)]
9struct Args {
10    #[arg(long, env = "CLIPPY_OUTPUTS", value_delimiter = ';')]
11    outputs: Vec<Utf8PathBuf>,
12}
13
14#[derive(serde_derive::Deserialize)]
15struct ClippyJson {
16    #[serde(rename = "$message_type")]
17    message_type: String,
18    rendered: Option<String>,
19}
20
21fn main() {
22    let args = Args::parse();
23
24    let mut failed = false;
25    for manifest in args.outputs {
26        let manifest = std::fs::read_to_string(manifest).expect("CLIPPY_OUTPUTS malformed");
27        for line in manifest.lines().map(|line| line.trim()).filter(|line| !line.is_empty()) {
28            let diagnostic = serde_json::from_str::<ClippyJson>(line).expect("DIAGNOSTIC malformed");
29            if diagnostic.message_type == "diagnostic" {
30                failed |= true;
31                if let Some(rendered) = diagnostic.rendered {
32                    eprintln!("{rendered}")
33                }
34            }
35        }
36    }
37
38    std::process::exit(if failed { 1 } else { 0 })
39}