summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock11
-rw-r--r--Cargo.toml2
-rw-r--r--crates/system_action/action_macros/src/lib.rs34
-rw-r--r--crates/system_action/src/action.rs21
-rw-r--r--crates/utils/tcp_connection/src/error.rs6
-rw-r--r--crates/vcs_data/Cargo.toml4
-rw-r--r--examples/Cargo.toml21
-rw-r--r--examples/src/bin/example_action_system.rs18
-rw-r--r--examples/src/lib.rs1
-rw-r--r--src/lib.rs4
10 files changed, 115 insertions, 7 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 7ed2554..bad00f8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -413,6 +413,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
+name = "examples"
+version = "0.1.0"
+dependencies = [
+ "action_system",
+ "cfg_file",
+ "string_proc",
+ "tcp_connection",
+ "tokio",
+]
+
+[[package]]
name = "fiat-crypto"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 72f3270..881fbbe 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -13,6 +13,8 @@ vcs = []
[workspace]
members = [
+ "examples",
+
"crates/utils/cfg_file",
"crates/utils/cfg_file/cfg_file_derive",
"crates/utils/cfg_file/cfg_file_test",
diff --git a/crates/system_action/action_macros/src/lib.rs b/crates/system_action/action_macros/src/lib.rs
index 5d274ad..a7de9b6 100644
--- a/crates/system_action/action_macros/src/lib.rs
+++ b/crates/system_action/action_macros/src/lib.rs
@@ -55,10 +55,38 @@ 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 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
+ }
+ }
+
+ #[allow(dead_code)]
#[deprecated = "This function is used by #[action_gen] as a template."]
- #[doc = " This function is used by #[action_gen] as a template to generate the struct. "]
- #[doc = " It is forbidden to call it anywhere."]
- #[doc = " and call it using the function name."]
+ #[doc = "Template function for #[[action_gen]] - do not call directly."]
+ #[doc = "Use the generated struct instead."]
+ #[doc = ""]
+ #[doc = "Register the action to the pool."]
+ #[doc = "```rust"]
+ #[doc = "YourActionPascalName::register_to_pool(&mut pool);"]
+ #[doc = "```"]
+ #[doc = ""]
+ #[doc = "Process the action at the pool."]
+ #[doc = "```rust"]
+ #[doc = "let result = YourActionPascalName::process_at_pool(&pool, ctx, arg).await?;"]
+ #[doc = "```"]
#fn_vis #fn_sig #fn_block
}
}
diff --git a/crates/system_action/src/action.rs b/crates/system_action/src/action.rs
index 14f1148..562a142 100644
--- a/crates/system_action/src/action.rs
+++ b/crates/system_action/src/action.rs
@@ -11,13 +11,30 @@ pub trait Action<Args, Return> {
) -> impl std::future::Future<Output = Result<Return, TcpTargetError>> + Send;
}
+#[derive(Default)]
pub struct ActionContext {
// Whether the action is executed locally or remotely
local: bool,
/// The connection instance in the current context,
/// used to interact with the machine on the other end
- instance: ConnectionInstance,
+ instance: Option<ConnectionInstance>,
+}
+
+impl ActionContext {
+ /// Generate local context
+ pub fn local() -> Self {
+ let mut ctx = ActionContext::default();
+ ctx.local = true;
+ ctx
+ }
+
+ /// Generate remote context
+ pub fn remote() -> Self {
+ let mut ctx = ActionContext::default();
+ ctx.local = false;
+ ctx
+ }
}
impl ActionContext {
@@ -32,7 +49,7 @@ impl ActionContext {
}
/// Get the connection instance in the current context
- pub fn instance(&self) -> &ConnectionInstance {
+ pub fn instance(&self) -> &Option<ConnectionInstance> {
&self.instance
}
}
diff --git a/crates/utils/tcp_connection/src/error.rs b/crates/utils/tcp_connection/src/error.rs
index ffcce6f..691e5ee 100644
--- a/crates/utils/tcp_connection/src/error.rs
+++ b/crates/utils/tcp_connection/src/error.rs
@@ -35,6 +35,12 @@ pub enum TcpTargetError {
#[error("Pool already exists: {0}")]
PoolAlreadyExists(String),
+
+ #[error("Not local machine: {0}")]
+ NotLocal(String),
+
+ #[error("Not remote machine: {0}")]
+ NotRemote(String),
}
impl From<io::Error> for TcpTargetError {
diff --git a/crates/vcs_data/Cargo.toml b/crates/vcs_data/Cargo.toml
index 07f1a6a..b3bc4a2 100644
--- a/crates/vcs_data/Cargo.toml
+++ b/crates/vcs_data/Cargo.toml
@@ -4,9 +4,13 @@ edition = "2024"
version.workspace = true
[dependencies]
+
+# Utils
tcp_connection = { path = "../utils/tcp_connection" }
cfg_file = { path = "../utils/cfg_file", features = ["default"] }
string_proc = { path = "../utils/string_proc" }
+
+# Core
action_system = { path = "../system_action" }
# Identity
diff --git a/examples/Cargo.toml b/examples/Cargo.toml
new file mode 100644
index 0000000..3a6cee2
--- /dev/null
+++ b/examples/Cargo.toml
@@ -0,0 +1,21 @@
+[package]
+name = "examples"
+edition = "2024"
+version.workspace = true
+
+[[bin]]
+name = "example_action_system"
+path = "src/bin/example_action_system.rs"
+
+[dependencies]
+
+# Utils
+tcp_connection = { path = "../crates/utils/tcp_connection" }
+cfg_file = { path = "../crates/utils/cfg_file", features = ["default"] }
+string_proc = { path = "../crates/utils/string_proc" }
+
+# Core
+action_system = { path = "../crates/system_action" }
+
+# Async & Networking
+tokio = { version = "1.46.1", features = ["full"] }
diff --git a/examples/src/bin/example_action_system.rs b/examples/src/bin/example_action_system.rs
new file mode 100644
index 0000000..a659eb3
--- /dev/null
+++ b/examples/src/bin/example_action_system.rs
@@ -0,0 +1,18 @@
+use action_system::{action::ActionContext, action_gen, action_pool::ActionPool};
+use tcp_connection::error::TcpTargetError;
+
+#[tokio::main]
+async fn main() {
+ let mut pool = ActionPool::new();
+ PrintNameAction::register_to_pool(&mut pool);
+
+ PrintNameAction::process_at_pool(&pool, ActionContext::local(), "World".to_string())
+ .await
+ .unwrap();
+}
+
+#[action_gen]
+async fn print_name_action(_ctx: ActionContext, name: String) -> Result<(), TcpTargetError> {
+ println!("Hello, {}!", name);
+ Ok(())
+}
diff --git a/examples/src/lib.rs b/examples/src/lib.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/examples/src/lib.rs
@@ -0,0 +1 @@
+
diff --git a/src/lib.rs b/src/lib.rs
index 746f66f..29855e3 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,8 +1,8 @@
// Feature `vcs`
#[cfg(feature = "vcs")]
pub mod vcs {
- extern crate vcs;
- pub use vcs::*;
+ extern crate vcs_data;
+ pub use vcs_data::*;
extern crate vcs_actions;
pub use vcs_actions::*;