use crate::db::Db; use rhailib_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, Map, Module}; use std::collections::HashMap; use std::sync::Arc; use crate::models::circle::Circle; type RhaiCircle = Circle; use crate::db::hero::OurDB; use crate::db::Collection; use crate::models::circle::ThemeData; #[export_module] mod rhai_circle_module { use super::RhaiCircle; // this one configures the users own circle #[rhai_fn(name = "configure", return_raw)] pub fn configure() -> Result> { Ok(Circle::new()) } #[rhai_fn(name = "new_circle", return_raw)] pub fn new_circle() -> Result> { Ok(Circle::new()) } #[rhai_fn(name = "set_title", return_raw)] pub fn set_title( circle: &mut RhaiCircle, title: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.title(title); Ok(circle.clone()) } #[rhai_fn(name = "set_ws_url", return_raw)] pub fn set_ws_url( circle: &mut RhaiCircle, ws_url: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.ws_url(ws_url); Ok(circle.clone()) } #[rhai_fn(name = "set_description", return_raw)] pub fn set_description( circle: &mut RhaiCircle, description: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.description(description); Ok(circle.clone()) } #[rhai_fn(name = "set_logo", return_raw)] pub fn set_logo( circle: &mut RhaiCircle, logo: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.logo(logo); Ok(circle.clone()) } #[rhai_fn(name = "set_theme", return_raw)] pub fn set_theme( circle: &mut RhaiCircle, theme: ThemeData, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.theme(theme); Ok(circle.clone()) } #[rhai_fn(name = "add_circle", return_raw)] pub fn add_circle( circle: &mut RhaiCircle, new_circle: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.add_circle(new_circle); Ok(circle.clone()) } #[rhai_fn(name = "add_member", return_raw)] pub fn add_member( circle: &mut RhaiCircle, member: String, ) -> Result> { let owned = std::mem::take(circle); *circle = owned.add_member(member); Ok(circle.clone()) } // --- Getters --- #[rhai_fn(name = "get_id")] pub fn get_id(c: &mut RhaiCircle) -> i64 { c.base_data.id as i64 } #[rhai_fn(name = "get_title")] pub fn get_title(c: &mut RhaiCircle) -> String { c.title.clone() } #[rhai_fn(name = "get_ws_url")] pub fn get_ws_url(c: &mut RhaiCircle) -> String { c.ws_url.clone() } #[rhai_fn(name = "get_description")] pub fn get_description(c: &mut RhaiCircle) -> Option { c.description.clone() } #[rhai_fn(name = "get_logo")] pub fn get_logo(c: &mut RhaiCircle) -> Option { c.logo.clone() } #[rhai_fn(name = "get_circles")] pub fn get_circles(c: &mut RhaiCircle) -> Array { c.circles.iter().map(|s| Dynamic::from(s.clone())).collect() } #[rhai_fn(name = "get_members")] pub fn get_members(c: &mut RhaiCircle) -> Array { c.members.iter().map(|s| Dynamic::from(s.clone())).collect() } } pub fn register_circle_rhai_module(engine: &mut Engine) { let mut module = exported_module!(rhai_circle_module); register_authorized_create_by_id_fn!( module: &mut module, rhai_fn_name: "save_circle", resource_type_str: "Circle", rhai_return_rust_type: crate::models::circle::Circle ); register_authorized_get_by_id_fn!( module: &mut module, rhai_fn_name: "get_circle", resource_type_str: "Circle", rhai_return_rust_type: crate::models::circle::Circle ); register_authorized_delete_by_id_fn!( module: &mut module, rhai_fn_name: "delete_circle", resource_type_str: "Circle", rhai_return_rust_type: crate::models::circle::Circle ); engine.register_global_module(module.into()); }