clippy_test_runner/
main.rs1use 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}