summaryrefslogtreecommitdiff
path: root/src/cmds
diff options
context:
space:
mode:
author魏曹先生 <1992414357@qq.com>2026-03-19 21:38:00 +0800
committer魏曹先生 <1992414357@qq.com>2026-03-19 21:38:00 +0800
commite1f7bda5ab0c260c03d8789ed370d3adc89d5972 (patch)
treea8d334b47df3183dd47b0b1ff170667d2e11a9ee /src/cmds
parent2e65a3f4afb97ba3fc4bcfce0bb5561c3a8408b4 (diff)
Add workspace alias command for ID mapping management
Diffstat (limited to 'src/cmds')
-rw-r--r--src/cmds/arg/workspace_alias.rs16
-rw-r--r--src/cmds/cmd/workspace_alias.rs105
-rw-r--r--src/cmds/comp/workspace_alias.rs25
-rw-r--r--src/cmds/in/workspace_alias.rs10
-rw-r--r--src/cmds/out/alias_query.rs7
-rw-r--r--src/cmds/renderer/alias_query.rs31
6 files changed, 194 insertions, 0 deletions
diff --git a/src/cmds/arg/workspace_alias.rs b/src/cmds/arg/workspace_alias.rs
new file mode 100644
index 0000000..69286bd
--- /dev/null
+++ b/src/cmds/arg/workspace_alias.rs
@@ -0,0 +1,16 @@
+#[derive(clap::Parser)]
+pub struct JVWorkspaceAliasArgument {
+ pub id: u32,
+
+ #[arg(long = "to")]
+ pub to: Option<u32>,
+
+ #[arg(short = 'i', long = "insert")]
+ pub insert: bool,
+
+ #[arg(short = 'q', long = "query")]
+ pub query: bool,
+
+ #[arg(short = 'e', long = "erase")]
+ pub erase: bool,
+}
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!();
diff --git a/src/cmds/comp/workspace_alias.rs b/src/cmds/comp/workspace_alias.rs
new file mode 100644
index 0000000..c2fc234
--- /dev/null
+++ b/src/cmds/comp/workspace_alias.rs
@@ -0,0 +1,25 @@
+use cli_utils::string_vec;
+
+use crate::systems::comp::context::CompletionContext;
+
+pub fn comp(ctx: CompletionContext) -> Option<Vec<String>> {
+ if ctx.all_words.contains(&"--insert".to_string()) {
+ if ctx.all_words.len() > 7 {
+ return None;
+ }
+ } else if ctx.all_words.len() > 5 {
+ return None;
+ }
+
+ if ctx.current_word.starts_with('-') {
+ return Some(string_vec![
+ "-i", "--insert", "-q", "--query", "-e", "--erase", "--to",
+ ]);
+ }
+
+ if ctx.previous_word == "--to" {
+ return Some(vec![]);
+ }
+
+ return None;
+}
diff --git a/src/cmds/in/workspace_alias.rs b/src/cmds/in/workspace_alias.rs
new file mode 100644
index 0000000..ca9566a
--- /dev/null
+++ b/src/cmds/in/workspace_alias.rs
@@ -0,0 +1,10 @@
+pub struct JVWorkspaceAliasInput {
+ pub query: bool,
+ pub mode: JVWorkspaceAliasInputMode,
+}
+
+pub enum JVWorkspaceAliasInputMode {
+ Insert(u32, u32),
+ Erase(u32),
+ None(u32),
+}
diff --git a/src/cmds/out/alias_query.rs b/src/cmds/out/alias_query.rs
new file mode 100644
index 0000000..2311741
--- /dev/null
+++ b/src/cmds/out/alias_query.rs
@@ -0,0 +1,7 @@
+use serde::Serialize;
+
+#[derive(Serialize)]
+pub struct JVAliasQueryOutput {
+ pub local: u32,
+ pub remote: Option<u32>,
+}
diff --git a/src/cmds/renderer/alias_query.rs b/src/cmds/renderer/alias_query.rs
new file mode 100644
index 0000000..8d6f8df
--- /dev/null
+++ b/src/cmds/renderer/alias_query.rs
@@ -0,0 +1,31 @@
+use cli_utils::display::markdown::Markdown;
+use render_system_macros::result_renderer;
+use rust_i18n::t;
+
+use crate::{
+ cmds::out::alias_query::JVAliasQueryOutput,
+ r_println,
+ systems::{cmd::errors::CmdRenderError, render::renderer::JVRenderResult},
+};
+
+#[result_renderer(JVAliasQueryRenderer)]
+pub async fn render(data: &JVAliasQueryOutput) -> Result<JVRenderResult, CmdRenderError> {
+ let mut r = JVRenderResult::default();
+ match (data.local, data.remote) {
+ (local, Some(remote)) => r_println!(
+ r,
+ "{}",
+ t!("workspace_alias.render.map", local = local, remote = remote)
+ .trim()
+ .markdown()
+ ),
+ (local, None) => r_println!(
+ r,
+ "{}",
+ t!("workspace_alias.render.no_map", local = local)
+ .trim()
+ .markdown()
+ ),
+ }
+ Ok(r)
+}