tracel_xtask/
lib.rs

1pub mod commands;
2pub mod context;
3pub mod environment;
4pub mod logging;
5pub mod utils;
6mod versions;
7
8// re-exports
9pub mod prelude {
10    pub use anyhow;
11    pub use clap;
12    pub use derive_more;
13    pub use env_logger;
14    pub use rand;
15    pub use serde_json;
16    pub use tracing_subscriber;
17
18    pub mod macros {
19        pub use tracel_xtask_macros::base_commands;
20        pub use tracel_xtask_macros::declare_command_args;
21        pub use tracel_xtask_macros::extend_command_args;
22        pub use tracel_xtask_macros::extend_subcommands;
23        pub use tracel_xtask_macros::extend_targets;
24    }
25
26    pub use crate::commands as base_commands;
27    pub use crate::commands::build::BuildCmdArgs;
28    pub use crate::commands::bump::BumpCmdArgs;
29    pub use crate::commands::bump::BumpSubCommand;
30    pub use crate::commands::check::CheckCmdArgs;
31    pub use crate::commands::check::CheckSubCommand;
32    pub use crate::commands::compile::CompileCmdArgs;
33    pub use crate::commands::coverage::CoverageCmdArgs;
34    pub use crate::commands::dependencies::DependenciesCmdArgs;
35    pub use crate::commands::dependencies::DependenciesSubCommand;
36    pub use crate::commands::doc::DocCmdArgs;
37    pub use crate::commands::doc::DocSubCommand;
38    pub use crate::commands::docker::DockerCmdArgs;
39    pub use crate::commands::docker::DockerSubCommand;
40    pub use crate::commands::fix::FixCmdArgs;
41    pub use crate::commands::fix::FixSubCommand;
42    pub use crate::commands::publish::PublishCmdArgs;
43    pub use crate::commands::test::TestCmdArgs;
44    pub use crate::commands::test::TestSubCommand;
45    pub use crate::commands::validate::ValidateCmdArgs;
46    pub use crate::commands::vulnerabilities::VulnerabilitiesCmdArgs;
47    pub use crate::commands::vulnerabilities::VulnerabilitiesSubCommand;
48    pub use crate::commands::Target;
49    pub use crate::context::Context;
50    pub use crate::endgroup;
51    pub use crate::environment::Environment;
52    pub use crate::group;
53    pub use crate::group_info;
54    pub use crate::handle_cleanup;
55    pub use crate::init_xtask;
56    pub use crate::parse_args;
57    pub use crate::register_cleanup;
58    pub use crate::utils::cargo::ensure_cargo_crate_is_installed;
59    pub use crate::utils::cleanup::CLEANUP_HANDLER;
60    pub use crate::utils::helpers;
61    pub use crate::utils::process::random_port;
62    pub use crate::utils::process::run_process;
63    pub use crate::utils::process::run_process_for_package;
64    pub use crate::utils::process::run_process_for_workspace;
65    pub use crate::utils::prompt::ask_once;
66    pub use crate::utils::rustup::is_current_toolchain_nightly;
67    pub use crate::utils::rustup::rustup_add_component;
68    pub use crate::utils::rustup::rustup_add_target;
69    pub use crate::utils::rustup::rustup_get_installed_targets;
70    pub use crate::utils::time::format_duration;
71    pub use crate::XtaskArgs;
72    // does not re-export strum has it is incompatible with strum macros expansions
73}
74
75use crate::context::Context;
76use crate::environment::Environment;
77use crate::logging::init_logger;
78
79#[macro_use]
80extern crate log;
81
82#[derive(clap::Parser)]
83#[command(author, version, about, long_about = None)]
84pub struct XtaskArgs<C: clap::Subcommand> {
85    /// Enable code coverage for Rust code if available (see coverage command for more info).
86    #[arg(long)]
87    pub enable_coverage: bool,
88    /// Set environment (for commands that support it).
89    #[arg(short = 'e', long, default_value_t = Environment::default())]
90    pub environment: Environment,
91    /// Set context (for commands that support it).
92    #[arg(short = 'c', long, default_value_t = Context::default())]
93    pub context: Context,
94    #[command(subcommand)]
95    pub command: C,
96}
97
98pub fn parse_args<C: clap::Subcommand>() -> anyhow::Result<XtaskArgs<C>> {
99    // init logs early
100    init_logger().init();
101    let args = <XtaskArgs<C> as clap::Parser>::parse();
102    Ok(args)
103}
104
105pub fn init_xtask<C: clap::Subcommand>(args: XtaskArgs<C>) -> anyhow::Result<XtaskArgs<C>> {
106    // environment
107    group_info!("Environment: {}", args.environment);
108    args.environment.load()?;
109    group_info!("Context: {}", args.context);
110    // code coverage
111    if args.enable_coverage {
112        group_info!("Enabling coverage support...");
113        setup_coverage()?;
114    }
115    Ok(args)
116}
117
118fn setup_coverage() -> anyhow::Result<()> {
119    unsafe {
120        std::env::set_var("RUSTFLAGS", "-Cinstrument-coverage");
121        std::env::set_var("LLVM_PROFILE_FILE", "burn-%p-%m.profraw");
122    }
123    Ok(())
124}