use crate::client::ClickUpClient;
use crate::commands::auth::resolve_token;
use crate::commands::workspace::resolve_workspace;
use crate::error::CliError;
use crate::output::OutputConfig;
use crate::Cli;
use clap::Subcommand;
#[derive(Subcommand)]
pub enum TemplateCommands {
List {
#[arg(long, default_value = "0")]
page: u32,
},
#[command(name = "apply-task")]
ApplyTask {
template_id: String,
#[arg(long)]
list: String,
#[arg(long)]
name: String,
},
#[command(name = "apply-list")]
ApplyList {
template_id: String,
#[arg(long, conflicts_with = "space")]
folder: Option<String>,
#[arg(long)]
space: Option<String>,
#[arg(long)]
name: String,
},
#[command(name = "apply-folder")]
ApplyFolder {
template_id: String,
#[arg(long)]
space: String,
#[arg(long)]
name: String,
},
}
const TEMPLATE_FIELDS: &[&str] = &["id", "name"];
pub async fn execute(command: TemplateCommands, cli: &Cli) -> Result<(), CliError> {
let token = resolve_token(cli)?;
let client = ClickUpClient::new(&token, cli.timeout)?;
let output = OutputConfig::from_cli(&cli.output, &cli.fields, cli.no_header, cli.quiet);
match command {
TemplateCommands::List { page } => {
let ws_id = resolve_workspace(cli)?;
let resp = client
.get(&format!("/v2/team/{}/taskTemplate?page={}", ws_id, page))
.await?;
let mut templates = resp
.get("templates")
.and_then(|v| v.as_array())
.cloned()
.unwrap_or_default();
if let Some(limit) = cli.limit {
templates.truncate(limit);
}
output.print_items(&templates, TEMPLATE_FIELDS, "id");
Ok(())
}
TemplateCommands::ApplyTask {
template_id,
list,
name,
} => {
let body = serde_json::json!({ "name": name });
let resp = client
.post(
&format!("/v2/list/{}/taskTemplate/{}", list, template_id),
&body,
)
.await?;
println!("{}", serde_json::to_string_pretty(&resp).unwrap());
Ok(())
}
TemplateCommands::ApplyList {
template_id,
folder,
space,
name,
} => {
let body = serde_json::json!({ "name": name });
let path = if let Some(f) = folder {
format!("/v2/folder/{}/list_template/{}", f, template_id)
} else if let Some(s) = space {
format!("/v2/space/{}/list_template/{}", s, template_id)
} else {
return Err(CliError::ClientError {
message: "Specify --folder or --space".into(),
status: 0,
});
};
let resp = client.post(&path, &body).await?;
println!("{}", serde_json::to_string_pretty(&resp).unwrap());
Ok(())
}
TemplateCommands::ApplyFolder {
template_id,
space,
name,
} => {
let body = serde_json::json!({ "name": name });
let resp = client
.post(
&format!("/v2/space/{}/folder_template/{}", space, template_id),
&body,
)
.await?;
println!("{}", serde_json::to_string_pretty(&resp).unwrap());
Ok(())
}
}
}