flowey_lib_hvlite/
build_guide.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Build the OpenVMM Guide.
5
6use flowey::node::prelude::*;
7
8flowey_request! {
9    pub struct Request {
10        pub built_guide: WriteVar<GuideOutput>,
11    }
12}
13
14#[derive(Serialize, Deserialize)]
15pub struct GuideOutput {
16    #[serde(rename = "Guide")]
17    pub guide: PathBuf,
18}
19
20impl Artifact for GuideOutput {}
21
22new_flow_node!(struct Node);
23
24impl FlowNode for Node {
25    type Request = Request;
26
27    fn imports(ctx: &mut ImportCtx<'_>) {
28        ctx.import::<crate::git_checkout_openvmm_repo::Node>();
29        ctx.import::<flowey_lib_common::download_mdbook_admonish::Node>();
30        ctx.import::<flowey_lib_common::download_mdbook_mermaid::Node>();
31        ctx.import::<flowey_lib_common::download_mdbook::Node>();
32        ctx.import::<flowey_lib_common::install_rust::Node>();
33    }
34
35    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
36        let mdbook_bin = ctx.reqv(flowey_lib_common::download_mdbook::Request::GetMdbook);
37        let mdbook_admonish_bin =
38            ctx.reqv(flowey_lib_common::download_mdbook_admonish::Request::GetMdbookAdmonish);
39        let mdbook_mermaid_bin =
40            ctx.reqv(flowey_lib_common::download_mdbook_mermaid::Request::GetMdbookMermaid);
41
42        let guide_source = ctx
43            .reqv(crate::git_checkout_openvmm_repo::req::GetRepoDir)
44            .map(ctx, |p| p.join("Guide"));
45
46        let rust_is_installed = ctx.reqv(flowey_lib_common::install_rust::Request::EnsureInstalled);
47
48        for Request { built_guide } in requests {
49            ctx.emit_rust_step("build OpenVMM guide (mdbook)", |ctx| {
50                // rust must be installed to build the `mdbook-openvmm-shim`
51                rust_is_installed.clone().claim(ctx);
52                let mdbook_bin = mdbook_bin.clone().claim(ctx);
53                let mdbook_admonish_bin = mdbook_admonish_bin.clone().claim(ctx);
54                let mdbook_mermaid_bin = mdbook_mermaid_bin.clone().claim(ctx);
55                let built_guide = built_guide.claim(ctx);
56                let guide_source = guide_source.clone().claim(ctx);
57                |rt| {
58                    let mdbook_bin = rt.read(mdbook_bin);
59                    let mdbook_admonish_bin = rt.read(mdbook_admonish_bin);
60                    let mdbook_mermaid_bin = rt.read(mdbook_mermaid_bin);
61
62                    let sh = xshell::Shell::new()?;
63
64                    let out_path: PathBuf = sh.current_dir().absolute()?.join("book");
65                    let guide_source: PathBuf = rt.read(guide_source);
66
67                    sh.change_dir(&guide_source);
68                    xshell::cmd!(
69                        sh,
70                        "{mdbook_bin} build {guide_source} --dest-dir {out_path}"
71                    )
72                    // intercepted by the `mdbook-openvmm-shim`
73                    .env("SHIM_MDBOOK_ADMONISH", mdbook_admonish_bin)
74                    .env("SHIM_MDBOOK_MERMAID", mdbook_mermaid_bin)
75                    .run()?;
76
77                    rt.write(built_guide, &GuideOutput { guide: out_path });
78
79                    Ok(())
80                }
81            });
82        }
83
84        Ok(())
85    }
86}