diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-18 22:50:03 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-18 22:50:03 +0800 |
| commit | 74bc8902be593796eb6292151e08374072766e3e (patch) | |
| tree | f3de024bf06753649ff2a51587ee5e54a1c92435 /src/cmds/cmd/workspace_sheet.rs | |
| parent | 5372793a49567dcba7315bf8e7bc5a1cab2d5a76 (diff) | |
Add workspace sheet command with help and localization
Diffstat (limited to 'src/cmds/cmd/workspace_sheet.rs')
| -rw-r--r-- | src/cmds/cmd/workspace_sheet.rs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/cmds/cmd/workspace_sheet.rs b/src/cmds/cmd/workspace_sheet.rs new file mode 100644 index 0000000..a360203 --- /dev/null +++ b/src/cmds/cmd/workspace_sheet.rs @@ -0,0 +1,109 @@ +use crate::{ + cmd_output, + cmds::{ + arg::workspace_sheet::JVWorkspaceSheetArgument, collect::workspace::JVWorkspaceCollect, + converter::make_sheet_error::MakeSheetErrorConverter, + r#in::workspace_sheet::JVWorkspaceSheetInput, out::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 rust_i18n::t; + +pub struct JVWorkspaceSheetCommand; +type Cmd = JVWorkspaceSheetCommand; +type Arg = JVWorkspaceSheetArgument; +type In = JVWorkspaceSheetInput; +type Collect = JVWorkspaceCollect; + +async fn help_str() -> String { + helpdoc_viewer::display("commands/workspace/sheet").await; + String::new() +} + +async fn prepare(_args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + let input = match (_args.new, _args.delete, _args.list_all, _args.print_path) { + (true, false, false, false) => { + let name = _args.name.as_ref().ok_or_else(|| { + CmdPrepareError::Error( + t!("workspace_sheet.error.sheet_name_required_for_new") + .trim() + .to_string(), + ) + })?; + JVWorkspaceSheetInput::Add(name.clone()) + } + (false, true, false, false) => { + let name = _args.name.as_ref().ok_or_else(|| { + CmdPrepareError::Error( + t!("workspace_sheet.error.sheet_name_required_for_delete") + .trim() + .to_string(), + ) + })?; + JVWorkspaceSheetInput::Delete(name.clone()) + } + (false, false, true, false) => JVWorkspaceSheetInput::ListAll, + (false, false, false, true) => { + let name = _args.name.as_ref().ok_or_else(|| { + CmdPrepareError::Error( + t!("workspace_sheet.error.sheet_name_required_for_print_path") + .trim() + .to_string(), + ) + })?; + JVWorkspaceSheetInput::PrintPath(name.clone()) + } + _ => { + return Err(CmdPrepareError::Error( + t!("workspace_sheet.error.exactly_one_required") + .trim() + .to_string(), + )); + } + }; + Ok(input) +} + +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> { + match input { + JVWorkspaceSheetInput::Add(sheet_name) => { + if let Err(e) = collect.manager.make_sheet(sheet_name).await { + return Err(MakeSheetErrorConverter::to_exec_error(e)); + } + } + JVWorkspaceSheetInput::Delete(sheet_name) => { + if let Err(e) = collect.manager.drop_sheet(sheet_name).await { + return Err(MakeSheetErrorConverter::to_exec_error(e)); + } + } + JVWorkspaceSheetInput::ListAll => { + collect + .manager + .list_sheet_names() + .await + .iter() + .for_each(|name| println!("{}", name)); + } + JVWorkspaceSheetInput::PrintPath(sheet_name) => { + println!("{}", collect.manager.get_sheet_path(sheet_name).display()) + } + } + cmd_output!(JVNoneOutput => JVNoneOutput) +} + +crate::command_template!(); |
