flowey_lib_hvlite/
artifact_guide.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

//! Artifact: mdbook-rendered HvLite Guide

/// Publish the artifact.
pub mod publish {
    use flowey::node::prelude::*;

    flowey_request! {
        pub struct Request {
            pub rendered_guide: ReadVar<PathBuf>,
            pub artifact_dir: ReadVar<PathBuf>,
            pub done: WriteVar<SideEffect>,
        }
    }

    new_simple_flow_node!(struct Node);

    impl SimpleFlowNode for Node {
        type Request = Request;

        fn imports(ctx: &mut ImportCtx<'_>) {
            ctx.import::<flowey_lib_common::copy_to_artifact_dir::Node>();
        }

        fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
            let Request {
                rendered_guide,
                artifact_dir,
                done,
            } = request;

            let files = rendered_guide.map(ctx, |p| vec![("Guide".into(), p)]);
            ctx.req(flowey_lib_common::copy_to_artifact_dir::Request {
                debug_label: "guide".into(),
                files,
                artifact_dir,
                done,
            });

            Ok(())
        }
    }
}

/// Resolve the contents of an existing artifact.
pub mod resolve {
    use flowey::node::prelude::*;

    flowey_request! {
        pub struct Request {
            pub artifact_dir: ReadVar<PathBuf>,
            pub rendered_guide: WriteVar<PathBuf>,
        }
    }

    new_simple_flow_node!(struct Node);

    impl SimpleFlowNode for Node {
        type Request = Request;

        fn imports(ctx: &mut ImportCtx<'_>) {
            ctx.import::<flowey_lib_common::copy_to_artifact_dir::Node>();
        }

        fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
            let Request {
                artifact_dir,
                rendered_guide,
            } = request;

            ctx.emit_rust_step("resolve guide artifact", |ctx| {
                let artifact_dir = artifact_dir.claim(ctx);
                let rendered_guide = rendered_guide.claim(ctx);
                move |rt| {
                    let artifact_dir = rt.read(artifact_dir);
                    let guide_dir = artifact_dir.join("Guide");
                    if !guide_dir.exists() {
                        anyhow::bail!("malformed artifact! did not find Guide/ folder");
                    }
                    rt.write(rendered_guide, &guide_dir);
                    Ok(())
                }
            });

            Ok(())
        }
    }
}