use heromodels::db::Db; use macros::{ register_authorized_create_by_id_fn, register_authorized_delete_by_id_fn, register_authorized_get_by_id_fn, }; use rhai::plugin::*; use rhai::{Array, Dynamic, Engine, EvalAltResult, Module, INT}; use std::mem; use std::sync::Arc; use heromodels::db::hero::OurDB; use heromodels::db::Collection; use heromodels::models::flow::flow::Flow; use heromodels::models::flow::flow_step::FlowStep; type RhaiFlow = Flow; type RhaiFlowStep = FlowStep; #[export_module] mod rhai_flow_module { use super::{Array, Dynamic, RhaiFlow, RhaiFlowStep, INT}; #[rhai_fn(name = "new_flow", return_raw)] pub fn new_flow() -> Result> { Ok(Flow::new()) } // --- Setters --- #[rhai_fn(name = "name", return_raw)] pub fn set_name(flow: &mut RhaiFlow, name: String) -> Result> { let owned = std::mem::take(flow); *flow = owned.name(name); Ok(flow.clone()) } #[rhai_fn(name = "status", return_raw)] pub fn set_status(flow: &mut RhaiFlow, status: String) -> Result> { let owned = std::mem::take(flow); *flow = owned.status(status); Ok(flow.clone()) } #[rhai_fn(name = "add_step", return_raw)] pub fn add_step( flow: &mut RhaiFlow, step: RhaiFlowStep, ) -> Result> { let owned = std::mem::take(flow); *flow = owned.add_step(step); Ok(flow.clone()) } // --- Getters --- #[rhai_fn(get = "id", pure)] pub fn get_id(f: &mut RhaiFlow) -> INT { f.base_data.id as INT } #[rhai_fn(get = "name", pure)] pub fn get_name(f: &mut RhaiFlow) -> String { f.name.clone() } #[rhai_fn(get = "status", pure)] pub fn get_status(f: &mut RhaiFlow) -> String { f.status.clone() } #[rhai_fn(get = "steps", pure)] pub fn get_steps(f: &mut RhaiFlow) -> Array { f.steps.clone().into_iter().map(Dynamic::from).collect() } } pub fn register_flow_rhai_module(engine: &mut Engine) { engine.build_type::(); let mut module = exported_module!(rhai_flow_module); register_authorized_create_by_id_fn!( module: &mut module, rhai_fn_name: "save_flow", resource_type_str: "Flow", rhai_return_rust_type: heromodels::models::flow::flow::Flow ); register_authorized_get_by_id_fn!( module: &mut module, rhai_fn_name: "get_flow", resource_type_str: "Flow", rhai_return_rust_type: heromodels::models::flow::flow::Flow ); register_authorized_delete_by_id_fn!( module: &mut module, rhai_fn_name: "delete_flow", resource_type_str: "Flow", rhai_return_rust_type: heromodels::models::flow::flow::Flow ); engine.register_global_module(module.into()); }