feat: change fnonce of register_function to fn

This commit is contained in:
Byson94
2025-10-20 12:06:01 +05:30
parent c0ef865920
commit da57afb395
6 changed files with 25 additions and 25 deletions

View File

@@ -6,7 +6,7 @@ resolver = "2"
shared_utils = { version = "0.1.0", path = "crates/shared_utils" }
rhai_impl = { version = "0.1.0", path = "crates/rhai_impl" }
ewwii_plugin_api = { version = "0.6.0", path = "crates/ewwii_plugin_api" }
ewwii_plugin_api = { version = "0.6.1", path = "crates/ewwii_plugin_api" }
anyhow = "1.0.86"
ahash = "0.8.12"

View File

@@ -36,7 +36,7 @@ impl EwwiiAPI for EwwiiImpl {
fn register_function(
&self,
name: String,
f: Box<dyn FnOnce(rhai::Array) -> Dynamic + Send>,
f: Box<dyn Fn(Array) -> Dynamic + Send + Sync>,
) -> Result<(), String> {
let func_info = (name, f);
@@ -73,7 +73,7 @@ impl EwwiiAPI for EwwiiImpl {
pub(crate) enum PluginRequest {
RhaiEngineAct(Box<dyn FnOnce(&mut Engine) + Send>),
RegisterFunc((String, Box<dyn FnOnce(Array) -> Dynamic + Send>)),
RegisterFunc((String, Box<dyn Fn(Array) -> Dynamic + Send + Sync>)),
ListWidgetIds(Sender<Vec<u64>>),
WidgetRegistryAct(Box<dyn FnOnce(&mut widget_backend::WidgetRegistryRepr) + Send>),
}

View File

@@ -1,6 +1,6 @@
[package]
name = "ewwii_plugin_api"
version = "0.6.0"
version = "0.6.1"
authors = ["byson94 <byson94wastaken@gmail.com>"]
edition = "2021"
license = "GPL-3.0-or-later"

View File

@@ -86,7 +86,7 @@ pub trait EwwiiAPI: Send + Sync {
///
/// impl Plugin for DummyStructure {
/// fn init(&self, host: &dyn EwwiiAPI) {
/// host.register_function(Box::new(|args| {
/// host.register_function("my_func".to_string(), Box::new(|args| {
/// // Do stuff
/// // - Perform things on the args (if needed)
/// // - And return a value
@@ -100,7 +100,7 @@ pub trait EwwiiAPI: Send + Sync {
fn register_function(
&self,
name: String,
f: Box<dyn FnOnce(rhai::Array) -> rhai::Dynamic + Send>,
f: Box<dyn Fn(rhai::Array) -> rhai::Dynamic + Send + Sync>,
) -> Result<(), String>;
// == Widget Rendering & Logic == //

View File

@@ -20,17 +20,17 @@ pub mod slib {
/// ```javascript
/// import "api::slib" as slib;
///
/// let eg_output = slib::call("my_func", ["foo", 80, true]);
/// let eg_output = slib::call_fn("my_func", ["foo", 80, true]);
/// ```
pub fn call(fn_name: String, args: Array) -> Dynamic {
// TODO:
//
// - Find the function with the name
// - Call that function the args (pass it directly)
pub fn call_fn(fn_name: String, args: Array) -> Dynamic {
match shared_utils::slib_store::call_registered(&fn_name, args) {
Some(d) => d,
None => Dynamic::default()
Ok(Some(d)) => d,
Ok(None) => Dynamic::default(),
Err(e) => {
log::error!("Error calling function: {}", e);
Dynamic::default()
}
}
}
}

View File

@@ -3,28 +3,28 @@ use std::collections::HashMap;
use std::sync::Mutex;
use rhai::{Array, Dynamic};
static FUNC_REGISTRY: Lazy<Mutex<HashMap<String, Box<dyn FnOnce(Array) -> Dynamic + Send>>>> =
static FUNC_REGISTRY: Lazy<Mutex<HashMap<String, Box<dyn Fn(Array) -> Dynamic + Send + Sync>>>> =
Lazy::new(|| Mutex::new(HashMap::new()));
pub fn register_functions(
name: String,
func: Box<dyn FnOnce(Array) -> Dynamic + Send>
func: Box<dyn Fn(Array) -> Dynamic + Send + Sync>,
) -> Result<(), String> {
let mut registry = FUNC_REGISTRY
.lock()
.map_err(|e| e.to_string())?; // Propagate the error
.map_err(|e| e.to_string())?;
registry.insert(name, func);
Ok(())
}
pub fn call_registered(name: &str, args: Array) -> Result<Option<Dynamic>, String> {
let registry = FUNC_REGISTRY
.lock()
.map_err(|e| e.to_string())?;
pub fn call_registered(name: &str, args: Array) -> Option<Dynamic> {
let mut registry = FUNC_REGISTRY.lock().unwrap();
if let Some(func) = registry.remove(name) {
Some(func(args))
if let Some(func) = registry.get(name) {
Ok(Some(func(args)))
} else {
None
Ok(None)
}
}