flowey_lib_common/
ado_task_use_dotnet.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! ADO Task Wrapper: `UseDotNet@2`
5
6use flowey::node::prelude::*;
7
8flowey_request! {
9    pub struct Request {
10        pub version: String,
11        pub done: WriteVar<SideEffect>,
12    }
13}
14
15new_flow_node!(struct Node);
16
17impl FlowNode for Node {
18    type Request = Request;
19
20    fn imports(_ctx: &mut ImportCtx<'_>) {}
21
22    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
23        let mut done = Vec::new();
24        let mut version = None;
25
26        for req in requests {
27            same_across_all_reqs("version", &mut version, req.version)?;
28            done.push(req.done);
29        }
30
31        if done.is_empty() {
32            return Ok(());
33        }
34
35        let version = version.ok_or(anyhow::anyhow!("Missing essential request: version"))?;
36
37        // UseDotNet@2 requires version in the format "major.minor.x" (e.g.
38        // "8.0.x"), not just "8.0".
39        let ado_version = if version.matches('.').count() < 2 {
40            format!("{version}.x")
41        } else {
42            version
43        };
44
45        ctx.emit_ado_step("Install .NET SDK", move |ctx| {
46            done.claim(ctx);
47            move |_| {
48                format!(
49                    r#"
50                    - task: UseDotNet@2
51                      inputs:
52                        packageType: sdk
53                        version: '{ado_version}'
54                "#
55                )
56            }
57        });
58
59        Ok(())
60    }
61}