use std::fmt::Write as _;
use std::path::Path;
use anyhow::Result;
use config::Config;
use ipc::FolderDto;
use transport::iroh::Endpoint;
use crate::commands::{broker, conn, live_footer};
pub(crate) fn render(folders: &[FolderDto]) -> String {
if folders.is_empty() {
return "(no folders)".to_owned();
}
let mut out = String::with_capacity(folders.len().saturating_mul(16));
for f in folders {
let _ = writeln!(out, "{}", f.name);
}
out
}
pub(crate) async fn run(
cfg: &Config,
endpoint: Option<&Endpoint>,
device: Option<&str>,
config_path: Option<&Path>,
) -> Result<String> {
if endpoint.is_none() {
let rows = broker::folders(cfg, device, config_path).await?;
return Ok(live_footer(render(&rows)));
}
let mut client = conn::connect_map(cfg, endpoint, device).await?;
let result = session::live::folders(&mut client).await;
if let Err(e) = client.disconnect().await {
tracing::warn!("MAP disconnect failed: {e}");
}
let rows: Vec<FolderDto> = result?.into_iter().map(|f| FolderDto { name: f.name }).collect();
Ok(live_footer(render(&rows)))
}
#[cfg(test)]
mod tests;