flowey_lib_common/
download_mdbook_mermaid.rs1use flowey::node::prelude::*;
7
8flowey_request! {
9 pub enum Request {
10 Version(String),
12 GetMdbookMermaid(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_mermaid = 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::GetMdbookMermaid(v) => get_mdbook_mermaid.push(v),
35 }
36 }
37
38 let version = version.ok_or(anyhow::anyhow!("Missing essential request: Version"))?;
39 let get_mdbook_mermaid = get_mdbook_mermaid;
40
41 if get_mdbook_mermaid.is_empty() {
44 return Ok(());
45 }
46
47 let mdbook_mermaid_bin = ctx.platform().binary("mdbook-mermaid");
48
49 let tag = format!("v{version}");
50 let file_name = format!(
51 "mdbook-mermaid-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: "badboy".into(),
63 repo_name: "mdbook-mermaid".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-mermaid", |ctx| {
72 let extract_zip_deps = extract_zip_deps.clone().claim(ctx);
73 let get_mdbook_mermaid = get_mdbook_mermaid.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_mermaid_bin = extract_dir.join(mdbook_mermaid_bin);
86
87 rt.write_all(get_mdbook_mermaid, &mdbook_mermaid_bin);
88
89 Ok(())
90 }
91 });
92
93 Ok(())
94 }
95}