summaryrefslogtreecommitdiff
path: root/crates/system_action
diff options
context:
space:
mode:
Diffstat (limited to 'crates/system_action')
-rw-r--r--crates/system_action/Cargo.toml1
-rw-r--r--crates/system_action/action_macros/Cargo.toml4
-rw-r--r--crates/system_action/action_macros/src/lib.rs34
-rw-r--r--crates/system_action/src/action_pool.rs4
4 files changed, 27 insertions, 16 deletions
diff --git a/crates/system_action/Cargo.toml b/crates/system_action/Cargo.toml
index 120cb34..54ae454 100644
--- a/crates/system_action/Cargo.toml
+++ b/crates/system_action/Cargo.toml
@@ -9,6 +9,7 @@ action_system_macros = { path = "action_macros" }
# Serialization
serde = { version = "1.0.219", features = ["derive"] }
+serde_json = "1.0.140"
# Async & Networking
tokio = { version = "1.46.1", features = ["full"] }
diff --git a/crates/system_action/action_macros/Cargo.toml b/crates/system_action/action_macros/Cargo.toml
index 5ae14fa..869dcde 100644
--- a/crates/system_action/action_macros/Cargo.toml
+++ b/crates/system_action/action_macros/Cargo.toml
@@ -13,3 +13,7 @@ string_proc = { path = "../../utils/string_proc" }
syn = { version = "2.0", features = ["full", "extra-traits"] }
quote = "1.0"
proc-macro2 = "1.0"
+
+# Serialization
+serde = { version = "1.0.219", features = ["derive"] }
+serde_json = "1.0.140"
diff --git a/crates/system_action/action_macros/src/lib.rs b/crates/system_action/action_macros/src/lib.rs
index 04e974a..683efcb 100644
--- a/crates/system_action/action_macros/src/lib.rs
+++ b/crates/system_action/action_macros/src/lib.rs
@@ -37,6 +37,9 @@ fn generate_action_struct(input_fn: ItemFn, _is_local: bool) -> proc_macro2::Tok
let action_name_ident = &fn_name;
+ let register_this_action = quote::format_ident!("register_{}", action_name_ident);
+ let proc_this_action = quote::format_ident!("proc_{}", action_name_ident);
+
quote! {
#[derive(Debug, Clone, Default)]
#fn_vis struct #struct_name;
@@ -55,22 +58,23 @@ fn generate_action_struct(input_fn: ItemFn, _is_local: bool) -> proc_macro2::Tok
}
}
- impl #struct_name {
- #fn_vis fn register_to_pool(pool: &mut action_system::action_pool::ActionPool) {
- pool.register::<#struct_name, #arg_type, #return_type>();
- }
+ #fn_vis fn #register_this_action(pool: &mut action_system::action_pool::ActionPool) {
+ pool.register::<#struct_name, #arg_type, #return_type>();
+ }
- #fn_vis async fn process_at_pool<'a>(
- pool: &'a action_system::action_pool::ActionPool,
- ctx: action_system::action::ActionContext,
- #arg_param_name: #arg_type
- ) -> Result<#return_type, tcp_connection::error::TcpTargetError> {
- pool.process::<#arg_type, #return_type>(
- Box::leak(string_proc::snake_case!(stringify!(#action_name_ident)).into_boxed_str()),
- ctx,
- #arg_param_name
- ).await
- }
+ #fn_vis async fn #proc_this_action(
+ pool: &action_system::action_pool::ActionPool,
+ ctx: action_system::action::ActionContext,
+ #arg_param_name: #arg_type
+ ) -> Result<#return_type, tcp_connection::error::TcpTargetError> {
+ pool.process::<#arg_type, #return_type>(
+ Box::leak(string_proc::snake_case!(stringify!(#action_name_ident)).into_boxed_str()),
+ ctx,
+ serde_json::to_string(&#arg_param_name)
+ .map_err(|e| {
+ tcp_connection::error::TcpTargetError::Serialization(e.to_string())
+ })?
+ ).await
}
#[allow(dead_code)]
diff --git a/crates/system_action/src/action_pool.rs b/crates/system_action/src/action_pool.rs
index bc60f7f..a3e82d6 100644
--- a/crates/system_action/src/action_pool.rs
+++ b/crates/system_action/src/action_pool.rs
@@ -72,7 +72,7 @@ impl ActionPool {
&'a self,
action_name: &'a str,
context: ActionContext,
- args: Args,
+ args_json: String,
) -> Result<Return, TcpTargetError>
where
Args: serde::de::DeserializeOwned + Send + 'static,
@@ -80,6 +80,8 @@ impl ActionPool {
{
if let Some(action) = self.actions.get(action_name) {
let _ = self.exec_on_proc_begin(&context).await?;
+ let args: Args = serde_json::from_str(&args_json)
+ .map_err(|e| TcpTargetError::Serialization(format!("Deserialize failed: {}", e)))?;
let result = action.process_erased(context, Box::new(args)).await?;
let result = *result
.downcast::<Return>()