Skip to main content

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