use crate::cli::BugAction;
use crate::error::Result;
use crate::output::resources::bug::{
validate_json_field_selection, validate_table_columns, warn_unknown_fields, ColumnSpec,
};
use crate::output::writers::Writers;
use crate::types::{ApiMode, OutputFormat};
mod clone;
mod create;
mod history;
mod list;
mod my;
mod search;
mod update;
mod view;
fn bug_column_spec(action: &BugAction) -> Option<ColumnSpec<'_>> {
let (BugAction::List { field_args, .. }
| BugAction::My { field_args, .. }
| BugAction::Search { field_args, .. }
| BugAction::View { field_args, .. }) = action
else {
return None;
};
Some(ColumnSpec::new(
field_args.fields.as_deref(),
field_args.exclude_fields.as_deref(),
))
}
pub async fn execute(
action: &BugAction,
server: Option<&str>,
format: OutputFormat,
api: Option<ApiMode>,
w: &mut Writers<'_>,
) -> Result<()> {
update::validate_action(action)?;
if let Some(spec) = bug_column_spec(action) {
let is_view = matches!(action, BugAction::View { .. });
match format {
OutputFormat::Table => {
if is_view {
warn_unknown_fields(spec, w.err);
} else {
validate_table_columns(spec)?;
}
}
OutputFormat::Json => {
if !is_view {
validate_json_field_selection(spec)?;
}
warn_unknown_fields(spec, w.err);
}
}
}
if let BugAction::Search { .. } = action {
return search::handle(action, server, format, api, w).await;
}
let client = crate::commands::shared::connect_and_configure(server, api).await?;
match action {
BugAction::List { .. } => list::handle(&client, action, format, w).await,
BugAction::View { .. } => view::handle(&client, action, format, w).await,
BugAction::History { .. } => history::handle(&client, action, format, w).await,
BugAction::My { .. } => my::handle(&client, action, format, w).await,
BugAction::Create { .. } => create::handle(&client, action, format, w).await,
BugAction::Clone { .. } => clone::handle(&client, action, format, w).await,
BugAction::Update { .. } => update::handle(&client, action, format, w).await,
BugAction::Search { .. } => unreachable!("handled above"),
}
}