diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-01-12 04:28:28 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-01-12 04:51:34 +0800 |
| commit | c5fb22694e95f12c24b8d8af76999be7aea3fcec (patch) | |
| tree | 399d8a24ce491fb635f3d09f2123290fe784059e /actions/src/registry | |
| parent | 444754489aca0454eb54e15a49fb8a6db0b68a07 (diff) | |
Reorganize crate structure and move documentation files
Diffstat (limited to 'actions/src/registry')
| -rw-r--r-- | actions/src/registry/client_registry.rs | 123 | ||||
| -rw-r--r-- | actions/src/registry/server_registry.rs | 36 |
2 files changed, 159 insertions, 0 deletions
diff --git a/actions/src/registry/client_registry.rs b/actions/src/registry/client_registry.rs new file mode 100644 index 0000000..05cb7f1 --- /dev/null +++ b/actions/src/registry/client_registry.rs @@ -0,0 +1,123 @@ +use std::sync::Arc; + +use action_system::{action::ActionContext, action_pool::ActionPool}; +use cfg_file::config::ConfigFile; +use tcp_connection::error::TcpTargetError; +use vcs_data::data::{ + local::{LocalWorkspace, config::LocalConfig}, + user::UserDirectory, +}; + +use crate::{ + actions::{ + local_actions::{ + register_set_upstream_vault_action, register_update_to_latest_info_action, + }, + sheet_actions::{ + register_drop_sheet_action, register_edit_mapping_action, register_make_sheet_action, + register_merge_share_mapping_action, register_share_mapping_action, + }, + track_action::register_track_file_action, + user_actions::register_change_virtual_file_edit_right_action, + }, + connection::protocol::RemoteActionInvoke, +}; + +fn register_actions(pool: &mut ActionPool) { + // Pool register here + + // Local Actions + register_set_upstream_vault_action(pool); + register_update_to_latest_info_action(pool); + + // Sheet Actions + register_make_sheet_action(pool); + register_drop_sheet_action(pool); + register_edit_mapping_action(pool); + + // Share / Merge Share Actions + register_share_mapping_action(pool); + register_merge_share_mapping_action(pool); + + // Track Action + register_track_file_action(pool); + + // User Actions + register_change_virtual_file_edit_right_action(pool); +} + +pub fn client_action_pool() -> ActionPool { + // Create pool + let mut pool = ActionPool::new(); + + // Register actions + register_actions(&mut pool); + + // Add process events + pool.set_on_proc_begin(|ctx, args| Box::pin(on_proc_begin(ctx, args))); + + // Return + pool +} + +async fn on_proc_begin( + ctx: &mut ActionContext, + _args: &(dyn std::any::Any + Send + Sync), +) -> Result<(), TcpTargetError> { + // Is ctx remote + let is_remote = ctx.is_remote_action(); + + // Action name and arguments + let action_name = ctx.action_name().to_string(); + let action_args_json = ctx.action_args_json().clone(); + + // Insert LocalWorkspace Arc + let Ok(local_config) = LocalConfig::read().await else { + return Err(TcpTargetError::NotFound( + "The current directory does not have a local workspace".to_string(), + )); + }; + let local_workspace = match LocalWorkspace::init_current_dir(local_config) { + Some(workspace) => workspace, + None => { + return Err(TcpTargetError::NotFound( + "Failed to initialize local workspace.".to_string(), + )); + } + }; + let local_workspace_arc = Arc::new(local_workspace); + ctx.insert_arc_data(local_workspace_arc); + + // Insert UserDirectory Arc + let Some(user_directory) = UserDirectory::current_cfg_dir() else { + return Err(TcpTargetError::NotFound( + "The user directory does not exist.".to_string(), + )); + }; + + let user_directory_arc = Arc::new(user_directory); + ctx.insert_arc_data(user_directory_arc); + + // Get instance + let Some(instance) = ctx.instance() else { + return Err(TcpTargetError::Unsupported( + "Missing ConnectionInstance in current context, this ActionPool does not support this call" + .to_string())); + }; + + // If it's remote, invoke action at server + if is_remote { + // Build protocol message + let msg = RemoteActionInvoke { + action_name, + action_args_json, + }; + + // Send + let mut instance = instance.lock().await; + instance.write_msgpack(&msg).await?; + } + + // Return OK, wait for client to execute Action locally + Ok(()) +} diff --git a/actions/src/registry/server_registry.rs b/actions/src/registry/server_registry.rs new file mode 100644 index 0000000..356e640 --- /dev/null +++ b/actions/src/registry/server_registry.rs @@ -0,0 +1,36 @@ +use action_system::action_pool::ActionPool; + +use crate::actions::{ + local_actions::{register_set_upstream_vault_action, register_update_to_latest_info_action}, + sheet_actions::{ + register_drop_sheet_action, register_edit_mapping_action, register_make_sheet_action, + register_merge_share_mapping_action, register_share_mapping_action, + }, + track_action::register_track_file_action, + user_actions::register_change_virtual_file_edit_right_action, +}; + +pub fn server_action_pool() -> ActionPool { + let mut pool = ActionPool::new(); + + // Local Actions + register_set_upstream_vault_action(&mut pool); + register_update_to_latest_info_action(&mut pool); + + // Sheet Actions + register_make_sheet_action(&mut pool); + register_drop_sheet_action(&mut pool); + register_edit_mapping_action(&mut pool); + + // Share / Merge Share Actions + register_share_mapping_action(&mut pool); + register_merge_share_mapping_action(&mut pool); + + // Track Action + register_track_file_action(&mut pool); + + // User Actions + register_change_virtual_file_edit_right_action(&mut pool); + + pool +} |
