flowey_lib_common/
download_mdbook_admonish.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Download a copy of `mdbook-admonish`
5
6use flowey::node::prelude::*;
7
8flowey_request! {
9    pub enum Request {
10        /// Version of `mdbook-admonish` to install
11        Version(String),
12        /// Get a path to `mdbook-admonish`
13        GetMdbookAdmonish(WriteVar<PathBuf>),
14    }
15}
16
17new_flow_node!(struct Node);
18
19impl FlowNode for Node {
20    type Request = Request;
21
22    fn imports(ctx: &mut ImportCtx<'_>) {
23        ctx.import::<crate::install_dist_pkg::Node>();
24        ctx.import::<crate::download_gh_release::Node>();
25    }
26
27    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
28        let mut version = None;
29        let mut get_mdbook_admonish = Vec::new();
30
31        for req in requests {
32            match req {
33                Request::Version(v) => same_across_all_reqs("Version", &mut version, v)?,
34                Request::GetMdbookAdmonish(v) => get_mdbook_admonish.push(v),
35            }
36        }
37
38        let version = version.ok_or(anyhow::anyhow!("Missing essential request: Version"))?;
39        let get_mdbook_admonish = get_mdbook_admonish;
40
41        // -- end of req processing -- //
42
43        if get_mdbook_admonish.is_empty() {
44            return Ok(());
45        }
46
47        let mdbook_admonish_bin = ctx.platform().binary("mdbook-admonish");
48
49        let tag = format!("v{version}");
50        let file_name = format!(
51            "mdbook-admonish-v{}-x86_64-{}",
52            version,
53            match ctx.platform() {
54                FlowPlatform::Windows => "pc-windows-msvc.zip",
55                FlowPlatform::Linux(_) => "unknown-linux-gnu.tar.gz",
56                FlowPlatform::MacOs => "apple-darwin.tar.gz",
57                platform => anyhow::bail!("unsupported platform {platform}"),
58            }
59        );
60
61        let mdbook_zip = ctx.reqv(|v| crate::download_gh_release::Request {
62            repo_owner: "tommilligan".into(),
63            repo_name: "mdbook-admonish".into(),
64            needs_auth: false,
65            tag: tag.clone(),
66            file_name: file_name.clone(),
67            path: v,
68        });
69
70        let extract_zip_deps = crate::_util::extract::extract_zip_if_new_deps(ctx);
71        ctx.emit_rust_step("unpack mdbook-admonish", |ctx| {
72            let extract_zip_deps = extract_zip_deps.clone().claim(ctx);
73            let get_mdbook_admonish = get_mdbook_admonish.claim(ctx);
74            let mdbook_zip = mdbook_zip.claim(ctx);
75            move |rt| {
76                let mdbook_zip = rt.read(mdbook_zip);
77
78                let extract_dir = crate::_util::extract::extract_zip_if_new(
79                    rt,
80                    extract_zip_deps,
81                    &mdbook_zip,
82                    &tag,
83                )?;
84
85                let mdbook_admonish_bin = extract_dir.join(mdbook_admonish_bin);
86
87                rt.write_all(get_mdbook_admonish, &mdbook_admonish_bin);
88
89                Ok(())
90            }
91        });
92
93        Ok(())
94    }
95}