use anyhow::Result;
use clap::Parser;
use io_mbox::flag::MboxFlags;
use pimalaya_cli::printer::{Message, Printer};
use crate::mbox::{
arg::{MboxPathFlag, MessageIdsArg},
client::MboxClient,
flag::arg::FlagArg,
};
#[derive(Debug, Parser)]
pub struct MboxFlagAddCommand {
#[command(flatten)]
pub ids: MessageIdsArg,
#[command(flatten)]
pub mbox: MboxPathFlag,
#[arg(long = "flag", short, value_name = "FLAG", required = true)]
pub flags: Vec<FlagArg>,
}
impl MboxFlagAddCommand {
pub fn execute(self, printer: &mut impl Printer, client: &mut MboxClient) -> Result<()> {
let path = client.resolve_mbox(&self.mbox.inner);
let flags = MboxFlags::from_iter(self.flags.into_iter().map(Into::into));
let ids: Vec<&str> = self.ids.inner.iter().map(String::as_str).collect();
client.edit_flags(&path, &ids, |current| {
current
.iter()
.cloned()
.chain(flags.iter().cloned())
.collect()
})?;
printer.out(Message::new("Flag(s) successfully added"))
}
}