phlow_engine/
script.rs

1use crate::context::Context;
2use phlow_sdk::prelude::*;
3use phs::ScriptError;
4use rhai::{Engine, Scope, plugin::*, serde::to_dynamic};
5use std::sync::Arc;
6
7#[derive(Debug, Clone)]
8pub struct Script {
9    pub script: phs::Script,
10}
11
12impl Script {
13    pub fn try_build(engine: Arc<Engine>, script: &Value) -> Result<Self, ScriptError> {
14        let script = phs::Script::try_build(engine, script)?;
15        Ok(Self { script })
16    }
17
18    pub fn evaluate(&self, context: &Context) -> Result<Value, ScriptError> {
19        let mut scope = Scope::new();
20
21        let steps: Dynamic =
22            to_dynamic(context.get_steps().clone()).map_err(ScriptError::EvalError)?;
23        let main: Dynamic =
24            to_dynamic(context.get_main().clone()).map_err(ScriptError::EvalError)?;
25        let payload: Dynamic =
26            to_dynamic(context.get_payload().clone()).map_err(ScriptError::EvalError)?;
27        let input: Dynamic =
28            to_dynamic(context.get_input().clone()).map_err(ScriptError::EvalError)?;
29        let setup: Dynamic =
30            to_dynamic(context.get_setup().clone()).map_err(ScriptError::EvalError)?;
31        let tests: Dynamic =
32            to_dynamic(context.get_tests().clone()).map_err(ScriptError::EvalError)?;
33
34        scope.push_constant("tests", tests);
35        scope.push_constant("steps", steps);
36        scope.push_constant("main", main);
37        scope.push_constant("payload", payload);
38        scope.push_constant("input", input);
39        scope.push_constant("setup", setup);
40
41        self.script.evaluate_from_scope(&mut scope)
42    }
43}