Skip to main content

hx_plugins/api/
build.rs

1//! Build context API for plugins.
2//!
3//! Provides: (hx/build-success?), (hx/build-duration), (hx/build-warnings), etc.
4//! These are only available in post-build and post-test hooks.
5
6use crate::context::with_context;
7use crate::error::Result;
8use steel::SteelVal;
9use steel::steel_vm::engine::Engine;
10use steel::steel_vm::register_fn::RegisterFn;
11
12/// Register build context API functions.
13pub fn register(engine: &mut Engine) -> Result<()> {
14    engine.register_fn("hx/build-success?", build_success);
15    engine.register_fn("hx/build-duration", build_duration);
16    engine.register_fn("hx/build-warnings", build_warnings);
17    engine.register_fn("hx/build-errors", build_errors);
18    engine.register_fn("hx/test-passed?", test_passed);
19    engine.register_fn("hx/test-count", test_count);
20    Ok(())
21}
22
23/// Check if the build succeeded.
24fn build_success() -> SteelVal {
25    with_context(|ctx| {
26        ctx.build
27            .as_ref()
28            .map(|b| SteelVal::BoolV(b.success))
29            .unwrap_or(SteelVal::BoolV(false))
30    })
31    .unwrap_or(SteelVal::BoolV(false))
32}
33
34/// Get the build duration in seconds.
35fn build_duration() -> SteelVal {
36    with_context(|ctx| {
37        ctx.build
38            .as_ref()
39            .map(|b| SteelVal::NumV(b.duration.as_secs_f64()))
40            .unwrap_or(SteelVal::NumV(0.0))
41    })
42    .unwrap_or(SteelVal::NumV(0.0))
43}
44
45/// Get the list of build warnings.
46fn build_warnings() -> SteelVal {
47    with_context(|ctx| {
48        ctx.build
49            .as_ref()
50            .map(|b| {
51                let warnings: Vec<SteelVal> = b
52                    .warnings
53                    .iter()
54                    .map(|w| SteelVal::StringV(w.clone().into()))
55                    .collect();
56                SteelVal::ListV(warnings.into())
57            })
58            .unwrap_or_else(|| SteelVal::ListV(vec![].into()))
59    })
60    .unwrap_or_else(|| SteelVal::ListV(vec![].into()))
61}
62
63/// Get the list of build errors.
64fn build_errors() -> SteelVal {
65    with_context(|ctx| {
66        ctx.build
67            .as_ref()
68            .map(|b| {
69                let errors: Vec<SteelVal> = b
70                    .errors
71                    .iter()
72                    .map(|e| SteelVal::StringV(e.clone().into()))
73                    .collect();
74                SteelVal::ListV(errors.into())
75            })
76            .unwrap_or_else(|| SteelVal::ListV(vec![].into()))
77    })
78    .unwrap_or_else(|| SteelVal::ListV(vec![].into()))
79}
80
81/// Check if all tests passed.
82fn test_passed() -> SteelVal {
83    with_context(|ctx| {
84        ctx.test
85            .as_ref()
86            .map(|t| SteelVal::BoolV(t.passed))
87            .unwrap_or(SteelVal::BoolV(false))
88    })
89    .unwrap_or(SteelVal::BoolV(false))
90}
91
92/// Get test counts as an association list: ((passed . N) (failed . N) (skipped . N)).
93fn test_count() -> SteelVal {
94    with_context(|ctx| {
95        ctx.test.as_ref().map(|t| {
96            SteelVal::ListV(
97                vec![
98                    SteelVal::ListV(
99                        vec![
100                            SteelVal::SymbolV("passed".into()),
101                            SteelVal::IntV(t.passed_count as isize),
102                        ]
103                        .into(),
104                    ),
105                    SteelVal::ListV(
106                        vec![
107                            SteelVal::SymbolV("failed".into()),
108                            SteelVal::IntV(t.failed_count as isize),
109                        ]
110                        .into(),
111                    ),
112                    SteelVal::ListV(
113                        vec![
114                            SteelVal::SymbolV("skipped".into()),
115                            SteelVal::IntV(t.skipped_count as isize),
116                        ]
117                        .into(),
118                    ),
119                ]
120                .into(),
121            )
122        })
123    })
124    .flatten()
125    .unwrap_or_else(|| {
126        SteelVal::ListV(
127            vec![
128                SteelVal::ListV(vec![SteelVal::SymbolV("passed".into()), SteelVal::IntV(0)].into()),
129                SteelVal::ListV(vec![SteelVal::SymbolV("failed".into()), SteelVal::IntV(0)].into()),
130                SteelVal::ListV(
131                    vec![SteelVal::SymbolV("skipped".into()), SteelVal::IntV(0)].into(),
132                ),
133            ]
134            .into(),
135        )
136    })
137}