Skip to main content

xtask/tasks/fmt/
rustfmt.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use 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}