use crate::gmail::GmailClient;
use crate::output::{OutputFormat, print_output};
use anyhow::Result;
use clap::{Args, Subcommand};
#[derive(Subcommand, Debug)]
pub enum DraftCommands {
Create(CreateArgs),
List(ListArgs),
Get(GetArgs),
Update(UpdateArgs),
Delete(DeleteArgs),
Send(SendArgs),
}
#[derive(Args, Debug)]
pub struct CreateArgs {
pub to: String,
pub subject: String,
pub body: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct ListArgs {
#[arg(short, long, default_value = "10")]
pub max: usize,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct GetArgs {
pub draft_id: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct UpdateArgs {
pub draft_id: String,
pub to: String,
pub subject: String,
pub body: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct DeleteArgs {
pub draft_id: String,
}
#[derive(Args, Debug)]
pub struct SendArgs {
pub draft_id: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
pub async fn handle_draft_cmd(client: &GmailClient, cmd: DraftCommands) -> Result<()> {
match cmd {
DraftCommands::Create(args) => {
let draft = client
.create_draft(&args.to, &args.subject, &args.body)
.await?;
print_output(&draft, args.format)?;
}
DraftCommands::List(args) => {
let drafts = client.list_drafts(args.max).await?;
print_output(&drafts, args.format)?;
}
DraftCommands::Get(args) => {
let draft = client.get_draft(&args.draft_id).await?;
print_output(&draft, args.format)?;
}
DraftCommands::Update(args) => {
let draft = client
.update_draft(&args.draft_id, &args.to, &args.subject, &args.body)
.await?;
print_output(&draft, args.format)?;
}
DraftCommands::Delete(args) => {
client.delete_draft(&args.draft_id).await?;
println!("Draft {} deleted", args.draft_id);
}
DraftCommands::Send(args) => {
let msg = client.send_draft(&args.draft_id).await?;
print_output(&msg, args.format)?;
}
}
Ok(())
}