1use crate::context::Context;
2use phlow_sdk::prelude::*;
3use phs::ScriptError;
4use rhai::{plugin::*, serde::to_dynamic, Engine, Scope};
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 = to_dynamic(context.steps.clone()).map_err(ScriptError::EvalError)?;
22 let main: Dynamic = to_dynamic(context.main.clone()).map_err(ScriptError::EvalError)?;
23 let payload: Dynamic =
24 to_dynamic(context.payload.clone()).map_err(ScriptError::EvalError)?;
25 let input: Dynamic = to_dynamic(context.input.clone()).map_err(ScriptError::EvalError)?;
26
27 scope.push_constant("steps", steps);
28 scope.push_constant("main", main);
29 scope.push_constant("payload", payload);
30 scope.push_constant("input", input);
31
32 self.script.evaluate_from_scope(&mut scope)
33 }
34}