diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-19 21:38:00 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-19 21:38:00 +0800 |
| commit | e1f7bda5ab0c260c03d8789ed370d3adc89d5972 (patch) | |
| tree | a8d334b47df3183dd47b0b1ff170667d2e11a9ee /src/cmds/cmd/workspace_alias.rs | |
| parent | 2e65a3f4afb97ba3fc4bcfce0bb5561c3a8408b4 (diff) | |
Add workspace alias command for ID mapping management
Diffstat (limited to 'src/cmds/cmd/workspace_alias.rs')
| -rw-r--r-- | src/cmds/cmd/workspace_alias.rs | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/cmds/cmd/workspace_alias.rs b/src/cmds/cmd/workspace_alias.rs new file mode 100644 index 0000000..1c38bdf --- /dev/null +++ b/src/cmds/cmd/workspace_alias.rs @@ -0,0 +1,105 @@ +use crate::{ + cmd_output, + cmds::{ + arg::workspace_alias::JVWorkspaceAliasArgument, + collect::workspace::JVWorkspaceCollect, + converter::workspace_operation_error::JVWorkspaceOperationErrorConverter, + r#in::workspace_alias::{JVWorkspaceAliasInput, JVWorkspaceAliasInputMode}, + out::{alias_query::JVAliasQueryOutput, none::JVNoneOutput}, + }, + systems::{ + cmd::{ + cmd_system::{AnyOutput, JVCommandContext}, + errors::{CmdExecuteError, CmdPrepareError}, + }, + helpdoc::helpdoc_viewer, + }, +}; +use cmd_system_macros::exec; +use just_enough_vcs::system::workspace::workspace::manager::WorkspaceManager; +use log::trace; +use rust_i18n::t; + +pub struct JVWorkspaceAliasCommand; +type Cmd = JVWorkspaceAliasCommand; +type Arg = JVWorkspaceAliasArgument; +type In = JVWorkspaceAliasInput; +type Collect = JVWorkspaceCollect; + +async fn help_str() -> String { + helpdoc_viewer::display("commands/workspace/alias").await; + String::new() +} + +async fn prepare(args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + let mode = match (args.insert, args.erase, args.to) { + (false, true, _) => JVWorkspaceAliasInputMode::Erase(args.id), + (true, false, Some(to)) => JVWorkspaceAliasInputMode::Insert(args.id, to), + (false, false, _) => JVWorkspaceAliasInputMode::None(args.id), + _ => { + return Err(CmdPrepareError::Error( + t!("workspace_alias.error.undeclared_input").to_string(), + )); + } + }; + + Ok(JVWorkspaceAliasInput { + query: args.query, + mode: mode, + }) +} + +async fn collect(_args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { + Ok(JVWorkspaceCollect { + manager: WorkspaceManager::new(), + }) +} + +#[exec] +async fn exec(input: In, collect: Collect) -> Result<AnyOutput, CmdExecuteError> { + let manager = collect.manager; + let index_source = match input.mode { + JVWorkspaceAliasInputMode::Insert(index, to) => { + trace!("Inserting alias for index: {}, to: {}", index, to); + manager + .write_id_alias(index, to) + .await + .map_err(JVWorkspaceOperationErrorConverter::to_exec_error)?; + index + } + JVWorkspaceAliasInputMode::Erase(index) => { + trace!("Erasing alias for index: {}", index); + manager + .delete_id_alias(index) + .await + .map_err(JVWorkspaceOperationErrorConverter::to_exec_error)?; + index + } + JVWorkspaceAliasInputMode::None(index) => { + trace!("No alias operation requested"); + // Do nothing + index + } + }; + + match (input.query, index_source) { + (true, index) => { + trace!("Querying alias for index: {}", index); + let remote = manager + .try_convert_to_remote(index) + .await + .map_err(JVWorkspaceOperationErrorConverter::to_exec_error)?; + trace!( + "Alias query result - local: {}, remote: {:?}", + index, remote + ); + cmd_output!(JVAliasQueryOutput => JVAliasQueryOutput { local: index, remote: remote }) + } + _ => { + trace!("No alias query requested or no index source available"); + cmd_output!(JVNoneOutput => JVNoneOutput) + } + } +} + +crate::command_template!(); |
