use std::{fmt, path::PathBuf};
use anyhow::Result;
use clap::Parser;
use io_mbox::mbox::Mbox;
use pimalaya_cli::{
printer::Printer,
table::{Cell, Color, Row, Table},
};
use schemars::JsonSchema;
use serde::Serialize;
use crate::{
account::context::Account, mbox::client::MboxClient, shared::table::style_from_preset,
};
#[derive(Debug, Parser)]
pub struct MboxMailboxListCommand;
impl MboxMailboxListCommand {
pub fn execute(
self,
printer: &mut impl Printer,
account: &mut Account,
client: &mut MboxClient,
) -> Result<()> {
let mboxes = client.list_mboxes()?;
let table = MboxesTable {
preset: account.table_preset().to_string(),
name_color: account.mailboxes_list_table_name_color(),
rows: mboxes.into_iter().map(From::from).collect(),
};
printer.out(table)
}
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct MboxesTable {
#[serde(skip)]
pub preset: String,
#[serde(skip)]
pub name_color: Color,
#[serde(rename = "mboxes")]
pub rows: Vec<MboxRow>,
}
impl fmt::Display for MboxesTable {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut table = Table::new();
table
.load_style(style_from_preset(&self.preset))
.set_header(Row::from([Cell::new("NAME"), Cell::new("PATH")]))
.add_rows(self.rows.iter().map(|m| {
let mut row = Row::new();
row.max_height(1)
.add_cell(Cell::new(&m.name).fg(self.name_color))
.add_cell(Cell::new(format!("{}", m.path.display())));
row
}));
writeln!(f)?;
write!(f, "{table}")?;
writeln!(f)?;
Ok(())
}
}
#[derive(Clone, Debug, Serialize, JsonSchema)]
pub struct MboxRow {
pub name: String,
pub path: PathBuf,
}
impl From<Mbox> for MboxRow {
fn from(mbox: Mbox) -> Self {
Self {
name: mbox.name.to_string(),
path: PathBuf::from(mbox.path.as_str()),
}
}
}