tracel_xtask/commands/
compile.rs

1use anyhow::Ok;
2use strum::IntoEnumIterator;
3
4use crate::{
5    commands::WARN_IGNORED_ONLY_ARGS,
6    endgroup, group,
7    prelude::{Context, Environment},
8    utils::{
9        process::{run_process_for_package, run_process_for_workspace},
10        workspace::{get_workspace_members, WorkspaceMemberType},
11    },
12};
13
14use super::Target;
15
16#[tracel_xtask_macros::declare_command_args(Target, None)]
17pub struct CompileCmdArgs {}
18
19pub fn handle_command(
20    args: CompileCmdArgs,
21    _env: Environment,
22    _ctx: Context,
23) -> anyhow::Result<()> {
24    if args.target == Target::Workspace && !args.only.is_empty() {
25        warn!("{WARN_IGNORED_ONLY_ARGS}");
26    }
27    run_compile(&args.target, &args.exclude, &args.only)
28}
29
30pub(crate) fn run_compile(
31    target: &Target,
32    excluded: &Vec<String>,
33    only: &Vec<String>,
34) -> anyhow::Result<()> {
35    match target {
36        Target::Workspace => {
37            group!("Compile Workspace");
38            run_process_for_workspace(
39                "cargo",
40                &["check", "--workspace"],
41                excluded,
42                None,
43                None,
44                "Workspace compilation failed",
45                None,
46                None,
47            )?;
48            endgroup!();
49        }
50        Target::Crates | Target::Examples => {
51            let members = match target {
52                Target::Crates => get_workspace_members(WorkspaceMemberType::Crate),
53                Target::Examples => get_workspace_members(WorkspaceMemberType::Example),
54                _ => unreachable!(),
55            };
56
57            for member in members {
58                group!("Compile: {}", member.name);
59                run_process_for_package(
60                    "cargo",
61                    &member.name,
62                    &["check", "-p", &member.name],
63                    excluded,
64                    only,
65                    &format!("Compilation failed for {}", &member.name),
66                    None,
67                    None,
68                )?;
69                endgroup!();
70            }
71        }
72        Target::AllPackages => {
73            Target::iter()
74                .filter(|t| *t != Target::AllPackages && *t != Target::Workspace)
75                .try_for_each(|t| run_compile(&t, excluded, only))?;
76        }
77    }
78    Ok(())
79}