use crate::cli::TemplateAction;
use crate::config::Config;
use crate::error::{BzrError, Result};
use crate::output::resources::template::{
write_template_detail, write_template_list, write_template_saved,
};
use crate::output::writers::Writers;
use crate::types::BugTemplate;
use crate::types::OutputFormat;
#[expect(
clippy::unused_async,
reason = "async for signature consistency with sibling execute fns"
)]
pub async fn execute(
action: &TemplateAction,
_server: Option<&str>,
format: OutputFormat,
_api: Option<crate::types::ApiMode>,
w: &mut Writers<'_>,
) -> Result<()> {
match action {
TemplateAction::Save {
name,
product,
component,
version,
priority,
severity,
assignee,
op_sys,
rep_platform,
description,
} => {
let template = BugTemplate {
product: product.clone(),
component: component.clone(),
version: version.clone(),
priority: priority.clone(),
severity: severity.clone(),
assignee: assignee.clone(),
op_sys: op_sys.clone(),
rep_platform: rep_platform.clone(),
description: description.clone(),
};
if template.product.is_none()
&& template.component.is_none()
&& template.version.is_none()
&& template.priority.is_none()
&& template.severity.is_none()
&& template.assignee.is_none()
&& template.op_sys.is_none()
&& template.rep_platform.is_none()
&& template.description.is_none()
{
return Err(BzrError::InputValidation(
"template must have at least one field set".into(),
));
}
let mut is_update = false;
Config::update_locked(|config| {
is_update = config.templates.contains_key(name.as_str());
config.templates.insert(name.clone(), template);
Ok(())
})?;
let verb = if is_update { "Updated" } else { "Saved" };
write_template_saved(name, verb, format, w.out);
}
TemplateAction::List => {
let config = Config::load()?;
write_template_list(&config.templates, format, w.out);
}
TemplateAction::Show { name } => {
let config = Config::load()?;
let template = config
.templates
.get(name.as_str())
.ok_or_else(|| BzrError::config(format!("template '{name}' not found")))?;
write_template_detail(name, template, format, w.out);
}
TemplateAction::Delete { name } => {
Config::update_locked(|config| {
if config.templates.remove(name.as_str()).is_none() {
return Err(BzrError::config(format!("template '{name}' not found")));
}
Ok(())
})?;
write_template_saved(name, "Deleted", format, w.out);
}
}
Ok(())
}
#[cfg(test)]
#[path = "template_tests.rs"]
mod tests;