summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cmds/arg/path.rs8
-rw-r--r--src/cmds/cmd/workspace.rs45
-rw-r--r--src/cmds/cmd/workspace_create.rs53
-rw-r--r--src/cmds/cmd/workspace_init.rs51
-rw-r--r--src/cmds/converter/workspace_operation_error.rs31
-rw-r--r--src/cmds/in/workspace_create.rs5
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,
+}