use std::fmt::Write as _;
use anyhow::Result;
use config::Config;
use map_core::{BMessage, MessageStatus};
use crate::cli::{folder_of, FolderArg};
use transport::iroh::Endpoint;
use crate::commands::conn;
const fn sender_label<'a>(name: &'a str, tel: &'a str) -> &'a str {
if name.is_empty() {
tel
} else {
name
}
}
pub(crate) fn render(msg: &BMessage) -> String {
let sender = msg.originator().map_or("(unknown)", |c| sender_label(&c.name, &c.tel));
let status = match msg.status() {
MessageStatus::Read => "read",
MessageStatus::Unread => "unread",
};
let body = &msg.envelope().body.text;
let folder = msg.folder().rsplit('/').next().unwrap_or_else(|| msg.folder());
let mut out = String::with_capacity(body.len().saturating_add(64));
let _ = write!(out, "From: {sender}\nFolder: {folder}\nStatus: {status}\n\n{body}");
out
}
pub(crate) async fn run(
cfg: &Config,
endpoint: Option<&Endpoint>,
device: Option<&str>,
handle: String,
folder: Option<FolderArg>,
mark_read: bool,
) -> Result<String> {
let mut client = conn::connect_map(cfg, endpoint, device).await?;
client.set_folder(folder_of(folder)).await?;
let msg = client.get_message(&handle).await?;
let out = render(&msg);
if mark_read {
if let Err(e) = client.set_message_status_read(&handle, MessageStatus::Read).await {
tracing::warn!("failed to mark {handle} read: {e}");
}
}
Ok(out)
}