flowey_lib_common/
run_cargo_clippy.rs1use crate::run_cargo_build::CargoBuildProfile;
7use crate::run_cargo_build::CargoFeatureSet;
8use flowey::node::prelude::*;
9
10#[derive(Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Clone)]
11pub enum CargoPackage {
12 Workspace,
13 Crate(String),
14}
15
16flowey_request! {
17 pub struct Request {
18 pub in_folder: ReadVar<PathBuf>,
19 pub package: CargoPackage,
20 pub profile: CargoBuildProfile,
21 pub features: CargoFeatureSet,
22 pub target: target_lexicon::Triple,
23 pub extra_env: Option<Vec<(String, String)>>,
24 pub exclude: ReadVar<Option<Vec<String>>>,
25 pub keep_going: bool,
26 pub all_targets: bool,
27 pub pre_build_deps: Vec<ReadVar<SideEffect>>,
32 pub done: WriteVar<SideEffect>,
33 }
34}
35
36new_flow_node!(struct Node);
37
38impl FlowNode for Node {
39 type Request = Request;
40
41 fn imports(ctx: &mut ImportCtx<'_>) {
42 ctx.import::<crate::cfg_cargo_common_flags::Node>();
43 ctx.import::<crate::install_rust::Node>();
44 }
45
46 fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
47 let rust_toolchain = ctx.reqv(crate::install_rust::Request::GetRustupToolchain);
48 let flags = ctx.reqv(crate::cfg_cargo_common_flags::Request::GetFlags);
49
50 for Request {
51 in_folder,
52 package,
53 profile,
54 features,
55 target,
56 extra_env,
57 exclude,
58 keep_going,
59 all_targets,
60 pre_build_deps,
61 done,
62 } in requests
63 {
64 ctx.req(crate::install_rust::Request::InstallTargetTriple(
65 target.clone(),
66 ));
67 ctx.req(crate::install_rust::Request::InstallComponent(
68 "clippy".into(),
69 ));
70
71 ctx.emit_rust_step("cargo clippy", |ctx| {
72 pre_build_deps.claim(ctx);
73 done.claim(ctx);
74 let rust_toolchain = rust_toolchain.clone().claim(ctx);
75 let flags = flags.clone().claim(ctx);
76 let in_folder = in_folder.claim(ctx);
77 let exclude = exclude.claim(ctx);
78 move |rt| {
79 let rust_toolchain = rt.read(rust_toolchain);
80 let flags = rt.read(flags);
81 let in_folder = rt.read(in_folder);
82 let exclude = rt.read(exclude);
83
84 let crate::cfg_cargo_common_flags::Flags {
85 locked,
86 verbose,
87 no_incremental,
88 } = flags;
89
90 let target = target.to_string();
91
92 let cargo_profile = match &profile {
93 CargoBuildProfile::Debug => "dev",
94 CargoBuildProfile::Release => "release",
95 CargoBuildProfile::Custom(s) => s,
96 };
97
98 let mut args = Vec::new();
99
100 args.push("clippy");
101 if verbose {
102 args.push("--verbose");
103 }
104 if locked {
105 args.push("--locked");
106 }
107 if keep_going {
108 args.push("--keep-going");
109 }
110 if all_targets {
111 args.push("--all-targets");
112 }
113 match &package {
114 CargoPackage::Workspace => args.push("--workspace"),
115 CargoPackage::Crate(crate_name) => {
116 args.push("-p");
117 args.push(crate_name);
118 }
119 }
120 let feature_strings = features.to_cargo_arg_strings();
121 args.extend(feature_strings.iter().map(|s| s.as_str()));
122 args.push("--target");
123 args.push(&target);
124 args.push("--profile");
125 args.push(cargo_profile);
126 if let Some(exclude) = &exclude {
127 for excluded_crate in exclude {
128 args.push("--exclude");
129 args.push(excluded_crate);
130 }
131 }
132
133 rt.sh.change_dir(in_folder);
134
135 let mut cmd = if let Some(rust_toolchain) = &rust_toolchain {
136 flowey::shell_cmd!(rt, "rustup run {rust_toolchain} cargo")
137 } else {
138 flowey::shell_cmd!(rt, "cargo")
139 };
140
141 if no_incremental {
142 cmd = cmd.env("CARGO_INCREMENTAL", "0");
143 }
144 if let Some(env) = extra_env {
145 for (key, val) in env {
146 log::info!("env: {key}={val}");
147 cmd = cmd.env(key, val);
148 }
149 }
150
151 cmd.args(args).run()?;
152
153 Ok(())
154 }
155 });
156 }
157
158 Ok(())
159 }
160}