pub mod admin;
pub mod api;
pub mod attachments;
pub mod auth;
pub(crate) mod authenticated;
pub mod boards;
pub mod cards;
pub mod checklist_items;
pub mod checklists;
pub(crate) mod client_error;
pub mod comments;
pub(crate) mod credential_ops;
pub mod custom_field_items;
pub mod custom_fields;
pub mod dependencies;
pub(crate) mod exports;
pub(crate) mod imports;
pub mod integrations;
pub mod lists;
pub mod profile;
pub mod rules;
pub mod skill;
pub mod swimlanes;
pub mod system;
mod transfer;
pub mod users;
#[cfg(test)]
mod tests;
use clap::Subcommand;
#[derive(Debug, Subcommand)]
pub enum RootCommand {
Skill(skill::SkillArgs),
System(system::SystemArgs),
Admin(Box<admin::AdminArgs>),
Rule(rules::RuleArgs),
Integration(integrations::IntegrationArgs),
Dependency(dependencies::DependencyArgs),
Attachment(attachments::AttachmentArgs),
Api(api::ApiArgs),
Auth(auth::AuthArgs),
Profile(profile::ProfileArgs),
User(users::UserArgs),
Board(boards::BoardArgs),
List(lists::ListArgs),
Card(Box<cards::CardArgs>),
Checklist(checklists::ChecklistArgs),
Comment(comments::CommentArgs),
CustomField(custom_fields::CustomFieldArgs),
Swimlane(swimlanes::SwimlaneArgs),
}
impl RootCommand {
pub fn supports_raw_output(&self) -> bool {
matches!(self, Self::Api(_))
|| self.export_delivery().is_some_and(|d| d.is_stdout())
|| matches!(self, Self::Attachment(args) if args.command.download_destination().is_some_and(|d| d.is_stdout()))
}
pub(crate) fn export_delivery(&self) -> Option<&exports::DeliveryArgs> {
match self {
Self::Board(a) => match &a.command {
boards::BoardCommand::Export(e) => Some(&e.delivery),
boards::BoardCommand::ExportAll(e) => Some(&e.delivery),
boards::BoardCommand::Chart(a) => a.delivery(),
_ => None,
},
Self::Card(a) => {
if let cards::CardCommand::Export(e) = &a.command {
Some(&e.delivery)
} else {
None
}
}
Self::Attachment(a) => {
if let attachments::AttachmentCommand::Export(e) = &a.command {
Some(&e.delivery)
} else {
None
}
}
_ => None,
}
}
pub(crate) fn validate_input(&self) -> Result<(), crate::error::AppError> {
if let Self::Board(a) = self {
if let boards::BoardCommand::Import(args) = &a.command {
args.validate()?;
}
if let boards::BoardCommand::ImportTrello(args) = &a.command {
args.validate()?;
}
}
if let Self::Board(a) = self {
if let boards::BoardCommand::Export(e) = &a.command {
e.validate()?;
}
}
if let Some(delivery) = self.export_delivery() {
delivery.validate()?;
}
Ok(())
}
pub fn validate_output(
&self,
format: crate::output::OutputFormat,
) -> Result<(), crate::error::AppError> {
self.validate_input()?;
if let Some(delivery) = self.export_delivery() {
delivery.validate_output(format)?;
}
if let Self::Attachment(args) = self {
args.command.validate_input()?;
if let Some(destination) = args.command.download_destination() {
destination.validate_output(format)?;
}
}
if format == crate::output::OutputFormat::Raw && !self.supports_raw_output() {
return Err(crate::error::AppError::invalid_input(
"--output raw requires api request, an export, or an attachment download with --destination -",
));
}
Ok(())
}
}