xtask/tasks/fmt/
rustfmt.rs1use super::FmtPass;
5use crate::fs_helpers::git_diffed;
6use crate::shell::XtaskShell;
7use crate::tasks::fmt::FmtCtx;
8
9pub struct Rustfmt;
10
11impl FmtPass for Rustfmt {
12 fn run(self, ctx: FmtCtx) -> anyhow::Result<()> {
13 let FmtCtx {
14 ctx,
15 fix,
16 only_diffed,
17 } = ctx;
18 let sh = XtaskShell::new()?;
19 let rust_toolchain = sh.var("RUST_TOOLCHAIN").map(|s| format!("+{s}")).ok();
20 let fmt_check = (!fix).then_some("--check");
21
22 if only_diffed {
23 let mut files = git_diffed(ctx.in_git_hook)?;
24 files.retain(|f| f.extension().unwrap_or_default() == "rs");
25
26 if !files.is_empty() {
27 let res = sh
28 .cmd("rustfmt")
29 .args(rust_toolchain)
30 .args(fmt_check)
31 .args(&files)
32 .quiet()
33 .run();
34
35 if res.is_err() {
36 anyhow::bail!("found formatting issues in diffed files");
37 }
38 }
39 } else {
40 sh.cmd("cargo")
41 .args(rust_toolchain)
42 .args(["fmt", "--"])
43 .args(fmt_check)
44 .quiet()
45 .run()?;
46 }
47
48 Ok(())
49 }
50}