use std::fmt;
use anyhow::Result;
use clap::Parser;
use io_mbox::flag::MboxFlags;
use pimalaya_cli::printer::Printer;
use schemars::JsonSchema;
use serde::Serialize;
use crate::{
mbox::{arg::MboxPathFlag, client::MboxClient, flag::arg::FlagArg},
shared::message::arg::MessageArg,
};
#[derive(Debug, Parser)]
pub struct MboxMessageSaveCommand {
#[command(flatten)]
pub mbox: MboxPathFlag,
#[arg(long = "flag", short, num_args = 0..)]
pub flags: Vec<FlagArg>,
#[command(flatten)]
pub message: MessageArg,
}
impl MboxMessageSaveCommand {
pub fn execute(self, printer: &mut impl Printer, client: &mut MboxClient) -> Result<()> {
let path = client.resolve_mbox(&self.mbox.inner);
let msg = self.message.parse()?;
let flags = MboxFlags::from_iter(self.flags.into_iter().map(Into::into));
let id = client.append(&path, flags, msg.into_bytes())?;
printer.out(StoredMessage { id })
}
}
#[derive(Serialize, JsonSchema)]
pub struct StoredMessage {
id: String,
}
impl fmt::Display for StoredMessage {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Message `{}` successfully saved", self.id)
}
}