1use std::process::{Command, Stdio};
2
3use cargo_metadata::{Metadata, MetadataCommand};
4
5use crate::Backend;
6
7#[derive(Debug, clap::Args)]
8pub struct ClippyArgs {
9 #[clap(default_value_t = Backend::All)]
11 pub backend: Backend,
12 #[clap(long = "keep-going")]
15 pub keep_going: bool,
16 pub flags: Vec<String>,
20}
21
22impl ClippyArgs {
23 pub(crate) fn run(&self) {
24 let metadata = MetadataCommand::default().exec().unwrap();
25 let failed = if matches!(self.backend, Backend::All) {
26 let mut failed = false;
27 for backend in Backend::ALL {
28 if !self.run_for_backend(*backend, &metadata) {
29 failed = true;
30 if !self.keep_going {
31 break;
32 }
33 }
34 }
35 failed
36 } else {
37 !self.run_for_backend(self.backend, &metadata)
38 };
39 if failed {
40 std::process::exit(1);
41 }
42 }
43
44 fn run_for_backend(&self, backend: Backend, metadata: &Metadata) -> bool {
45 let exclude = crate::utils::get_exclude_for_backend(&backend.to_string(), metadata);
46 let flags = [
47 "-F".into(),
48 format!("diesel/{backend}"),
49 "-F".into(),
50 format!("diesel_derives/{backend}"),
51 "-F".into(),
52 format!("diesel_cli/{backend}"),
53 "-F".into(),
54 format!("diesel_tests/{backend}"),
55 "-F".into(),
56 format!("diesel-dynamic-schema/{backend}"),
57 ];
58 let mut command = Command::new("cargo");
59
60 command
61 .args([
62 "clippy",
63 "--workspace",
64 "--no-default-features",
65 "--all-targets",
66 ])
67 .args(exclude)
68 .args(flags)
69 .args(["-F", "diesel/extras", "-F", "diesel/with-deprecated"])
70 .args(&self.flags)
71 .current_dir(&metadata.workspace_root);
72
73 println!("Run clippy via `{command:?}`");
74 command
75 .stderr(Stdio::inherit())
76 .stdout(Stdio::inherit())
77 .status()
78 .unwrap()
79 .success()
80 }
81}