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([
70 "-F",
71 "diesel/extras",
72 "-F",
73 "diesel/with-deprecated",
74 "-F",
75 "diesel_derives/numeric",
76 "-F",
77 "diesel_derives/chrono",
78 "-F",
79 "diesel_derives/time",
80 ])
81 .args(&self.flags)
82 .current_dir(&metadata.workspace_root);
83
84 println!("Run clippy via `{command:?}`");
85 command
86 .stderr(Stdio::inherit())
87 .stdout(Stdio::inherit())
88 .status()
89 .unwrap()
90 .success()
91 }
92}