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::run_cargo_build::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    locked: bool,
20
21    /// Automatically install all required dependencies
22    #[clap(long)]
23    auto_install_deps: bool,
24
25    /// Don't prompt user when running certain interactive commands.
26    #[clap(long)]
27    non_interactive: bool,
28
29    /// (WSL2 only) Force the use of `mono` to download nuget packages.
30    #[clap(long)]
31    force_nuget_mono: bool,
32
33    /// Claim that nuget is using an external auth mechanism.
34    ///
35    /// This will skip the check to make sure Azure Credential Provider is
36    /// installed.
37    #[clap(long)]
38    external_nuget_auth: bool,
39}
40
41pub type FulfillCommonRequestsParamsResolver =
42    Box<dyn for<'a> Fn(&mut PipelineJobCtx<'a>) -> flowey_lib_hvlite::_jobs::cfg_common::Params>;
43
44fn get_params_local(
45    local_run_args: Option<LocalRunArgs>,
46) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
47    Ok(Box::new(move |_ctx| {
48        let LocalRunArgs {
49            verbose,
50            locked,
51            auto_install_deps,
52            non_interactive,
53            force_nuget_mono,
54            external_nuget_auth,
55        } = local_run_args.clone().unwrap_or_default();
56
57        flowey_lib_hvlite::_jobs::cfg_common::Params {
58            local_only: Some(flowey_lib_hvlite::_jobs::cfg_common::LocalOnlyParams {
59                interactive: !non_interactive,
60                auto_install: auto_install_deps,
61                force_nuget_mono,
62                external_nuget_auth,
63                ignore_rust_version: true,
64            }),
65            verbose: ReadVar::from_static(verbose),
66            locked,
67            deny_warnings: false,
68        }
69    }))
70}
71
72fn get_params_cloud(
73    pipeline: &mut Pipeline,
74) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
75    let param_verbose = pipeline.new_parameter_bool(
76        "verbose",
77        "Run with verbose output",
78        ParameterKind::Stable,
79        Some(false),
80    );
81
82    Ok(Box::new(move |ctx: &mut PipelineJobCtx<'_>| {
83        flowey_lib_hvlite::_jobs::cfg_common::Params {
84            local_only: None,
85            verbose: ctx.use_parameter(param_verbose.clone()),
86            locked: true,
87            deny_warnings: true,
88        }
89    }))
90}
91
92pub fn get_cfg_common_params(
93    pipeline: &mut Pipeline,
94    backend_hint: PipelineBackendHint,
95    local_run_args: Option<LocalRunArgs>,
96) -> anyhow::Result<FulfillCommonRequestsParamsResolver> {
97    match backend_hint {
98        PipelineBackendHint::Local => get_params_local(local_run_args),
99        PipelineBackendHint::Ado | PipelineBackendHint::Github => {
100            if local_run_args.is_some() {
101                anyhow::bail!("cannot set local only params when emitting as non-local pipeline")
102            }
103            get_params_cloud(pipeline)
104        }
105    }
106}
107
108#[derive(clap::ValueEnum, Clone, Copy)]
109pub enum CommonArchCli {
110    X86_64,
111    Aarch64,
112}
113
114impl From<CommonArchCli> for CommonArch {
115    fn from(value: CommonArchCli) -> Self {
116        match value {
117            CommonArchCli::X86_64 => CommonArch::X86_64,
118            CommonArchCli::Aarch64 => CommonArch::Aarch64,
119        }
120    }
121}
122
123impl TryFrom<FlowArch> for CommonArchCli {
124    type Error = anyhow::Error;
125
126    fn try_from(arch: FlowArch) -> anyhow::Result<Self> {
127        Ok(match arch {
128            FlowArch::X86_64 => CommonArchCli::X86_64,
129            FlowArch::Aarch64 => CommonArchCli::Aarch64,
130            arch => anyhow::bail!("unsupported arch {arch}"),
131        })
132    }
133}