mod activities;
mod appbundles;
mod engines;
mod workitems;
use std::collections::HashMap;
use std::path::PathBuf;
use anyhow::Result;
use clap::Subcommand;
use serde::Deserialize;
use crate::output::OutputFormat;
use raps_da::DesignAutomationClient;
#[derive(Debug, Subcommand)]
pub enum DaCommands {
Engines,
Appbundles,
#[command(name = "appbundle-create")]
AppbundleCreate {
#[arg(short, long)]
id: Option<String>,
#[arg(short, long)]
engine: Option<String>,
#[arg(short, long)]
description: Option<String>,
},
#[command(name = "appbundle-delete")]
AppbundleDelete {
id: String,
},
#[command(name = "appbundle-upload")]
AppbundleUpload {
id: String,
#[arg(short, long)]
file: PathBuf,
#[arg(short, long)]
engine: String,
#[arg(short, long)]
description: Option<String>,
},
Activities,
#[command(name = "activity-create")]
ActivityCreate {
#[arg(short, long)]
file: Option<PathBuf>,
#[arg(long)]
id: Option<String>,
#[arg(long)]
engine: Option<String>,
#[arg(long)]
appbundle: Option<String>,
#[arg(long)]
command: Option<String>,
#[arg(long)]
description: Option<String>,
},
#[command(name = "activity-delete")]
ActivityDelete {
id: String,
},
#[command(name = "run")]
Run {
activity: String,
#[arg(short, long, value_parser = parse_argument)]
input: Vec<(String, String)>,
#[arg(long = "out-arg", value_parser = parse_argument)]
out_arg: Vec<(String, String)>,
#[arg(short, long)]
wait: bool,
},
Workitems,
Status {
workitem_id: String,
#[arg(short, long)]
wait: bool,
#[arg(short, long)]
download: bool,
#[arg(long)]
output_dir: Option<PathBuf>,
},
}
fn parse_argument(s: &str) -> Result<(String, String), String> {
let parts: Vec<&str> = s.splitn(2, '=').collect();
if parts.len() != 2 {
return Err(format!("Invalid argument format '{}'. Use key=value", s));
}
Ok((parts[0].to_string(), parts[1].to_string()))
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct ActivityDefinition {
pub(super) id: String,
pub(super) engine: String,
#[serde(default)]
pub(super) command_line: Vec<String>,
#[serde(default)]
pub(super) app_bundles: Vec<String>,
#[serde(default)]
pub(super) parameters: HashMap<String, ParameterDefinition>,
pub(super) description: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct ParameterDefinition {
pub(super) verb: String,
pub(super) local_name: Option<String>,
pub(super) description: Option<String>,
pub(super) required: Option<bool>,
pub(super) zip: Option<bool>,
}
impl DaCommands {
pub async fn execute(
self,
client: &DesignAutomationClient,
output_format: OutputFormat,
) -> Result<()> {
match self {
DaCommands::Engines => engines::list_engines(client, output_format).await,
DaCommands::Appbundles => appbundles::list_appbundles(client, output_format).await,
DaCommands::AppbundleCreate {
id,
engine,
description,
} => appbundles::create_appbundle(client, id, engine, description, output_format).await,
DaCommands::AppbundleDelete { id } => {
appbundles::delete_appbundle(client, &id, output_format).await
}
DaCommands::AppbundleUpload {
id,
file,
engine,
description,
} => {
appbundles::upload_appbundle(
client,
&id,
&file,
&engine,
description,
output_format,
)
.await
}
DaCommands::Activities => activities::list_activities(client, output_format).await,
DaCommands::ActivityCreate {
file,
id,
engine,
appbundle,
command,
description,
} => {
activities::create_activity(
client,
file,
id,
engine,
appbundle,
command,
description,
output_format,
)
.await
}
DaCommands::ActivityDelete { id } => {
activities::delete_activity(client, &id, output_format).await
}
DaCommands::Workitems => workitems::list_workitems(client, output_format).await,
DaCommands::Run {
activity,
input,
out_arg,
wait,
} => {
workitems::run_workitem(client, &activity, input, out_arg, wait, output_format)
.await
}
DaCommands::Status {
workitem_id,
wait,
download,
output_dir,
} => {
workitems::check_status(
client,
&workitem_id,
wait,
download,
output_dir,
output_format,
)
.await
}
}
}
}