tracel_xtask/commands/
compile.rs1use 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}