1use 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
12pub 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
23fn 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
34fn 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
45fn 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
63fn 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
81fn 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
92fn 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}