use clap::Subcommand;
use crate::cli::{Session, entity};
use crate::exit::ExitCode;
#[derive(Debug, Subcommand)]
pub enum PortfolioCommand {
#[command(long_about = crate::cli::help::md(crate::cli::help::PORTFOLIO_LIST))]
List {
#[arg(long, short = 'Q')]
query: Option<String>,
#[arg(long, default_value_t = 1)]
page: u32,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::PORTFOLIO_GET))]
Get {
id: String,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::PORTFOLIO_CONTENTS))]
Contents {
id: String,
#[arg(long, default_value_t = 1)]
page: u32,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::PORTFOLIO_PLACE))]
Place {
id: String,
#[arg(long, conflicts_with = "out")]
into: Option<String>,
#[arg(long, conflicts_with = "into")]
out: bool,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::ENTITY_CREATE))]
Create {
#[command(flatten)]
fields: entity::Fields,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::ENTITY_UPDATE))]
Update {
id: String,
#[command(flatten)]
fields: entity::Fields,
},
#[command(long_about = crate::cli::help::md(crate::cli::help::ENTITY_DELETE))]
Delete {
id: String,
},
}
pub async fn run(command: &PortfolioCommand, session: &Session) -> ExitCode {
match command {
PortfolioCommand::List { query, page } => {
entity::list("portfolio", query.as_deref(), *page, session).await
}
PortfolioCommand::Get { id } => entity::get("portfolio", id, session).await,
PortfolioCommand::Contents { id, page } => entity::contents(id, *page, session).await,
PortfolioCommand::Place { id, into, out } => {
if into.is_none() && !*out {
return crate::cli::report(
&"say where: --into <portfolio>, or --out to remove it from one",
crate::exit::ExitCode::ConfirmationRequired,
);
}
entity::place("portfolio", id, into.as_deref(), session).await
}
PortfolioCommand::Create { fields } => entity::create("portfolio", fields, session).await,
PortfolioCommand::Update { id, fields } => {
entity::update("portfolio", id, fields, session).await
}
PortfolioCommand::Delete { id } => entity::remove("portfolio", id, session).await,
}
}