Skip to main content

flowey_hvlite/pipelines_shared/
cfg_common_params.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Shared logic to set cfg_common params across various backends
5
6use flowey::node::prelude::*;
7use flowey::pipeline::prelude::*;
8use flowey_lib_hvlite::common::CommonArch;
9
10#[derive(Clone, Default, clap::Args)]
11#[clap(next_help_heading = "Local Only")]
12pub struct LocalRunArgs {
13    /// Emit verbose output when possible
14    #[clap(long)]
15    verbose: bool,
16
17    /// Run builds with --locked
18    #[clap(long)]
19    pub locked: bool,
20
21    /// Disable incremental compilation (sets CARGO_INCREMENTAL=0)
22    #[clap(long)]
23    pub no_incremental: bool,
24
25    /// Automatically install all required dependencies
26    #[clap(long)]
27    auto_install_deps: bool,
28
29    /// Don't prompt user when running certain interactive commands.
30    #[clap(long)]
31    non_interactive: bool,
32}
33
34pub type FulfillCommonRequestsParamsResolver =
35    Box<dyn for<'a> Fn(&mut PipelineJobCtx<'a>) -> flowey_lib_hvlite::_jobs::cfg_common::Params>;
36
37fn get_params_local(
38    local_run_args: Option<LocalRunArgs>,
39) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
40    Ok(Box::new(move |_ctx| {
41        let LocalRunArgs {
42            verbose,
43            locked,
44            no_incremental,
45            auto_install_deps,
46            non_interactive,
47        } = local_run_args.clone().unwrap_or_default();
48
49        flowey_lib_hvlite::_jobs::cfg_common::Params {
50            local_only: Some(flowey_lib_hvlite::_jobs::cfg_common::LocalOnlyParams {
51                interactive: !non_interactive,
52                auto_install: auto_install_deps,
53                ignore_rust_version: true,
54            }),
55            verbose: ReadVar::from_static(verbose),
56            locked,
57            deny_warnings: false,
58            no_incremental,
59        }
60    }))
61}
62
63fn get_params_cloud(
64    pipeline: &mut Pipeline,
65) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
66    let param_verbose = pipeline.new_parameter_bool(
67        "verbose",
68        "Run with verbose output",
69        ParameterKind::Stable,
70        Some(false),
71    );
72
73    Ok(Box::new(move |ctx: &mut PipelineJobCtx<'_>| {
74        flowey_lib_hvlite::_jobs::cfg_common::Params {
75            local_only: None,
76            verbose: ctx.use_parameter(param_verbose.clone()),
77            locked: true,
78            deny_warnings: true,
79            no_incremental: true,
80        }
81    }))
82}
83
84pub fn get_cfg_common_params(
85    pipeline: &mut Pipeline,
86    backend_hint: PipelineBackendHint,
87    local_run_args: Option<LocalRunArgs>,
88) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
89    match backend_hint {
90        PipelineBackendHint::Local => get_params_local(local_run_args),
91        PipelineBackendHint::Ado | PipelineBackendHint::Github => {
92            if local_run_args.is_some() {
93                anyhow::bail!("cannot set local only params when emitting as non-local pipeline")
94            }
95            get_params_cloud(pipeline)
96        }
97    }
98}
99
100#[derive(clap::ValueEnum, Clone, Copy, PartialEq)]
101pub enum CommonArchCli {
102    X86_64,
103    Aarch64,
104}
105
106impl From<CommonArchCli> for CommonArch {
107    fn from(value: CommonArchCli) -> Self {
108        match value {
109            CommonArchCli::X86_64 => CommonArch::X86_64,
110            CommonArchCli::Aarch64 => CommonArch::Aarch64,
111        }
112    }
113}
114
115impl TryFrom<FlowArch> for CommonArchCli {
116    type Error = anyhow::Error;
117
118    fn try_from(arch: FlowArch) -> anyhow::Result<Self> {
119        Ok(match arch {
120            FlowArch::X86_64 => CommonArchCli::X86_64,
121            FlowArch::Aarch64 => CommonArchCli::Aarch64,
122            arch => anyhow::bail!("unsupported arch {arch}"),
123        })
124    }
125}