flowey_lib_common/
download_mdbook.rs1use flowey::node::prelude::*;
7
8flowey_config! {
9 pub struct Config {
11 pub version: Option<String>,
13 }
14}
15
16flowey_request! {
17 pub enum Request {
18 GetMdbook(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 = Vec::new();
40
41 for req in requests {
42 match req {
43 Request::GetMdbook(v) => get_mdbook.push(v),
44 }
45 }
46
47 let version = config
48 .version
49 .ok_or(anyhow::anyhow!("missing config: version"))?;
50 let get_mdbook = get_mdbook;
51
52 if get_mdbook.is_empty() {
55 return Ok(());
56 }
57
58 let mdbook_bin = ctx.platform().binary("mdbook");
59
60 let tag = format!("v{version}");
61 let file_name = format!(
62 "mdbook-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: "rust-lang".into(),
74 repo_name: "mdBook".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", |ctx| {
83 let extract_zip_deps = extract_zip_deps.clone().claim(ctx);
84 let get_mdbook = get_mdbook.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_bin = extract_dir.join(mdbook_bin);
97
98 rt.write_all(get_mdbook, &mdbook_bin);
99
100 Ok(())
101 }
102 });
103
104 Ok(())
105 }
106}