diff options
| author | 魏曹先生 <1992414357@qq.com> | 2026-03-14 18:32:47 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2026-03-14 18:32:47 +0800 |
| commit | 707a1f7c747a08e2ce77df88edc1e72eae9cbebc (patch) | |
| tree | 53a64b10b788b57219ff2387322e50698d32198a /src | |
| parent | 521b7a7b08eebd30db215d84b55626fe8bf7533a (diff) | |
Add workspace commands and supporting types
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmds/arg/path.rs | 8 | ||||
| -rw-r--r-- | src/cmds/cmd/workspace.rs | 45 | ||||
| -rw-r--r-- | src/cmds/cmd/workspace_create.rs | 53 | ||||
| -rw-r--r-- | src/cmds/cmd/workspace_init.rs | 51 | ||||
| -rw-r--r-- | src/cmds/converter/workspace_operation_error.rs | 31 | ||||
| -rw-r--r-- | src/cmds/in/workspace_create.rs | 5 |
6 files changed, 193 insertions, 0 deletions
diff --git a/src/cmds/arg/path.rs b/src/cmds/arg/path.rs new file mode 100644 index 0000000..14ec34c --- /dev/null +++ b/src/cmds/arg/path.rs @@ -0,0 +1,8 @@ +use std::path::PathBuf; + +use clap::Parser; + +#[derive(Parser, Debug)] +pub struct JVPathArgument { + pub path: PathBuf, +} diff --git a/src/cmds/cmd/workspace.rs b/src/cmds/cmd/workspace.rs new file mode 100644 index 0000000..f72bcd5 --- /dev/null +++ b/src/cmds/cmd/workspace.rs @@ -0,0 +1,45 @@ +use crate::{ + cmd_output, + cmds::{ + arg::empty::JVEmptyArgument, collect::empty::JVEmptyCollect, r#in::empty::JVEmptyInput, + out::none::JVNoneOutput, + }, + systems::{ + cmd::{ + cmd_system::JVCommandContext, + errors::{CmdExecuteError, CmdPrepareError}, + }, + helpdoc::helpdoc_viewer, + }, +}; +use cmd_system_macros::exec; +use std::any::TypeId; + +pub struct JVWorkspaceCommand; +type Cmd = JVWorkspaceCommand; +type Arg = JVEmptyArgument; +type In = JVEmptyInput; +type Collect = JVEmptyCollect; + +async fn help_str() -> String { + helpdoc_viewer::display("commands/workspace").await; + String::new() +} + +async fn prepare(_args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + Ok(JVEmptyInput) +} + +async fn collect(_args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { + Ok(JVEmptyCollect) +} + +#[exec] +async fn exec( + _input: In, + _collect: Collect, +) -> Result<(Box<dyn std::any::Any + Send + 'static>, TypeId), CmdExecuteError> { + cmd_output!(JVNoneOutput => JVNoneOutput) +} + +crate::command_template!(); diff --git a/src/cmds/cmd/workspace_create.rs b/src/cmds/cmd/workspace_create.rs new file mode 100644 index 0000000..c5f8c8e --- /dev/null +++ b/src/cmds/cmd/workspace_create.rs @@ -0,0 +1,53 @@ +use crate::{ + cmd_output, + cmds::{ + arg::path::JVPathArgument, collect::empty::JVEmptyCollect, + converter::workspace_operation_error::JVWorkspaceOperationErrorConverter, + r#in::workspace_create::JVWorkspaceCreateInput, out::none::JVNoneOutput, + }, + systems::{ + cmd::{ + cmd_system::JVCommandContext, + errors::{CmdExecuteError, CmdPrepareError}, + }, + helpdoc::helpdoc_viewer, + }, +}; +use cmd_system_macros::exec; +use just_enough_vcs::system::workspace::func::create_workspace; +use std::any::TypeId; + +pub struct JVWorkspaceCreateCommand; +type Cmd = JVWorkspaceCreateCommand; +type Arg = JVPathArgument; +type In = JVWorkspaceCreateInput; +type Collect = JVEmptyCollect; + +async fn help_str() -> String { + helpdoc_viewer::display("commands/workspace/create").await; + String::new() +} + +async fn prepare(args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + Ok(JVWorkspaceCreateInput { + path: args.path.clone(), + }) +} + +async fn collect(_args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { + Ok(JVEmptyCollect) +} + +#[exec] +async fn exec( + input: In, + _collect: Collect, +) -> Result<(Box<dyn std::any::Any + Send + 'static>, TypeId), CmdExecuteError> { + create_workspace(input.path) + .await + .map_err(JVWorkspaceOperationErrorConverter::to_exec_error)?; + + cmd_output!(JVNoneOutput => JVNoneOutput) +} + +crate::command_template!(); diff --git a/src/cmds/cmd/workspace_init.rs b/src/cmds/cmd/workspace_init.rs new file mode 100644 index 0000000..543c4db --- /dev/null +++ b/src/cmds/cmd/workspace_init.rs @@ -0,0 +1,51 @@ +use crate::{ + cmd_output, + cmds::{ + arg::empty::JVEmptyArgument, collect::empty::JVEmptyCollect, + converter::workspace_operation_error::JVWorkspaceOperationErrorConverter, + r#in::empty::JVEmptyInput, out::none::JVNoneOutput, + }, + systems::{ + cmd::{ + cmd_system::JVCommandContext, + errors::{CmdExecuteError, CmdPrepareError}, + }, + helpdoc::helpdoc_viewer, + }, +}; +use cmd_system_macros::exec; +use just_enough_vcs::system::workspace::func::create_workspace_here; +use std::any::TypeId; + +pub struct JVWorkspaceInitCommand; +type Cmd = JVWorkspaceInitCommand; +type Arg = JVEmptyArgument; +type In = JVEmptyInput; +type Collect = JVEmptyCollect; + +async fn help_str() -> String { + helpdoc_viewer::display("commands/workspace/init").await; + String::new() +} + +async fn prepare(_args: &Arg, _ctx: &JVCommandContext) -> Result<In, CmdPrepareError> { + Ok(JVEmptyInput) +} + +async fn collect(_args: &Arg, _ctx: &JVCommandContext) -> Result<Collect, CmdPrepareError> { + Ok(JVEmptyCollect) +} + +#[exec] +async fn exec( + _input: In, + _collect: Collect, +) -> Result<(Box<dyn std::any::Any + Send + 'static>, TypeId), CmdExecuteError> { + create_workspace_here() + .await + .map_err(JVWorkspaceOperationErrorConverter::to_exec_error)?; + + cmd_output!(JVNoneOutput => JVNoneOutput) +} + +crate::command_template!(); diff --git a/src/cmds/converter/workspace_operation_error.rs b/src/cmds/converter/workspace_operation_error.rs new file mode 100644 index 0000000..f5f9d17 --- /dev/null +++ b/src/cmds/converter/workspace_operation_error.rs @@ -0,0 +1,31 @@ +use crate::systems::cmd::errors::CmdExecuteError; +use just_enough_vcs::system::workspace::workspace::error::WorkspaceOperationError; + +pub struct JVWorkspaceOperationErrorConverter; + +impl JVWorkspaceOperationErrorConverter { + pub fn to_exec_error(err: WorkspaceOperationError) -> CmdExecuteError { + match err { + WorkspaceOperationError::Io(error) => CmdExecuteError::Io(error), + WorkspaceOperationError::Other(msg) => CmdExecuteError::Error(msg), + WorkspaceOperationError::ConfigNotFound => { + CmdExecuteError::Error("Config not found".to_string()) + } + WorkspaceOperationError::WorkspaceNotFound => { + CmdExecuteError::Error("Workspace not found".to_string()) + } + WorkspaceOperationError::HandleLock(handle_lock_error) => { + CmdExecuteError::Error(format!("Handle lock error: {}", handle_lock_error)) + } + WorkspaceOperationError::DataRead(data_read_error) => { + CmdExecuteError::Error(format!("Data read error: {}", data_read_error)) + } + WorkspaceOperationError::DataWrite(data_write_error) => { + CmdExecuteError::Error(format!("Data write error: {}", data_write_error)) + } + WorkspaceOperationError::DataApply(data_apply_error) => { + CmdExecuteError::Error(format!("Data apply error: {}", data_apply_error)) + } + } + } +} diff --git a/src/cmds/in/workspace_create.rs b/src/cmds/in/workspace_create.rs new file mode 100644 index 0000000..f4ae241 --- /dev/null +++ b/src/cmds/in/workspace_create.rs @@ -0,0 +1,5 @@ +use std::path::PathBuf; + +pub struct JVWorkspaceCreateInput { + pub path: PathBuf, +} |
