use super::{render, AckAllOptions, ListOptions, Message, SendOptions};
use crate::out::Out;
use anyhow::{bail, Result};
use clap::{CommandFactory, Parser, Subcommand};
use std::path::PathBuf;
#[derive(Parser)]
#[command(
version = crate::GIT_VERSION,
name = "message",
about = "Local messaging faculty for the agent"
)]
pub struct Cli {
#[arg(long, env = "PILE")]
pile: PathBuf,
#[arg(long, env = "TRIBLESPACE_KEY")]
key: Option<PathBuf>,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Subcommand)]
enum Command {
Send {
to: String,
text: String,
#[arg(long, env = "PERSONA", value_name = "PERSON")]
from: Option<String>,
},
List {
reader: String,
#[arg(long)]
unread: bool,
#[arg(long, default_value_t = 20)]
limit: usize,
},
Ack {
id: String,
by: String,
},
AckAll {
by: String,
#[arg(long)]
from: Option<String>,
},
}
pub fn run() -> Result<()> {
let request = Cli::parse();
if request.command.is_none() {
let mut command = Cli::command();
command.print_help()?;
println!();
return Ok(());
}
crate::cli::with_output("message", |out| execute(request, out))
}
pub fn execute(request: Cli, out: &mut Out<'_>) -> Result<()> {
let Some(command) = request.command else {
return out.text(Cli::command().render_help().to_string());
};
let messages = Message::new(request.pile, request.key);
match command {
Command::Send { to, text, from } => {
let Some(from) = from
.map(|value| value.trim().to_owned())
.filter(|value| !value.is_empty())
else {
bail!("no sender: set $PERSONA or pass --from <person>\nusage: message send <TO> <TEXT> [--from <PERSON>]");
};
let text = crate::text_arg(&text, "message text")?;
let sent = messages.send(&SendOptions {
from: &from,
to: &to,
text: &text,
})?;
render::sent(&sent, &text, out)
}
Command::List {
reader,
unread,
limit,
} => render::list(
&messages.list(&ListOptions {
reader: &reader,
unread,
limit,
})?,
out,
),
Command::Ack { id, by } => render::acknowledged(&messages.ack(&id, &by)?, out),
Command::AckAll { by, from } => render::acknowledged_all(
&messages.ack_all(&AckAllOptions {
by: &by,
from: from.as_deref(),
})?,
out,
),
}
}