use crate::output::{OutputFormat, print_output};
use anyhow::Result;
use clap::{Args, Subcommand};
use grr_gmail::{CreateSendAsOptions, GmailClient, UpdateSendAsOptions};
#[derive(Subcommand, Debug)]
pub enum SendAsCommands {
List(ListArgs),
Get(GetArgs),
Create(CreateArgs),
Update(UpdateArgs),
Delete(DeleteArgs),
}
#[derive(Args, Debug)]
pub struct ListArgs {
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct GetArgs {
pub send_as_email: String,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct CreateArgs {
pub send_as_email: String,
#[arg(long)]
pub display_name: Option<String>,
#[arg(long)]
pub reply_to: Option<String>,
#[arg(long)]
pub signature: Option<String>,
#[arg(long)]
pub treat_as_alias: Option<bool>,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct UpdateArgs {
pub send_as_email: String,
#[arg(long)]
pub display_name: Option<String>,
#[arg(long)]
pub reply_to: Option<String>,
#[arg(long)]
pub signature: Option<String>,
#[arg(long)]
pub treat_as_alias: Option<bool>,
#[arg(short, long, value_enum, default_value = "json")]
pub format: OutputFormat,
}
#[derive(Args, Debug)]
pub struct DeleteArgs {
pub send_as_email: String,
}
pub async fn handle_send_as_cmd(client: &GmailClient, cmd: SendAsCommands) -> Result<()> {
match cmd {
SendAsCommands::List(args) => {
let send_as = client.list_send_as().await?;
print_output(&send_as, args.format)?;
}
SendAsCommands::Get(args) => {
let send_as = client.get_send_as(&args.send_as_email).await?;
print_output(&send_as, args.format)?;
}
SendAsCommands::Create(args) => {
let options = CreateSendAsOptions {
send_as_email: args.send_as_email,
display_name: args.display_name,
reply_to_address: args.reply_to,
signature: args.signature,
treat_as_alias: args.treat_as_alias,
};
let send_as = client.create_send_as(options).await?;
print_output(&send_as, args.format)?;
}
SendAsCommands::Update(args) => {
let options = UpdateSendAsOptions {
display_name: args.display_name,
reply_to_address: args.reply_to,
signature: args.signature,
treat_as_alias: args.treat_as_alias,
};
let send_as = client.update_send_as(&args.send_as_email, options).await?;
print_output(&send_as, args.format)?;
}
SendAsCommands::Delete(args) => {
client.delete_send_as(&args.send_as_email).await?;
println!("Send-as alias {} deleted", args.send_as_email);
}
}
Ok(())
}