use std::fmt::Write as _;
use std::io::Write;
use crate::config::Capabilities;
use crate::registry::Registry;
pub fn write_block(w: &mut dyn Write, s: &str) -> std::io::Result<()> {
if s.is_empty() {
return Ok(());
}
writeln!(w, "{}", s.trim_end_matches('\n'))
}
pub fn print_overview(
w: &mut dyn Write,
reg: &Registry,
words: &crate::dispatch::Words,
shadowed: &std::collections::BTreeSet<String>,
caps: Capabilities,
help_before: &str,
help_after: &str,
) -> std::io::Result<()> {
write_block(w, help_before)?;
let mut buf = String::new();
let _ = writeln!(buf, "{}", crate::lang::t("overview.usage_line"));
let mut cli_line = crate::lang::t("overview.cli_mode");
if caps.no_cli {
cli_line += &crate::lang::t("overview.disabled");
} else if !crate::dispatch::cli_frontend_compiled() {
cli_line += &crate::lang::t("overview.not_compiled");
}
let _ = writeln!(buf, "{cli_line}");
let http_state = if caps.no_http {
crate::lang::t("overview.disabled")
} else if !crate::dispatch::http_frontend_compiled() {
crate::lang::t("overview.not_compiled")
} else {
String::new()
};
if !shadowed.contains(&words.serve) {
let line = crate::lang::tf("overview.serve_mode", &[&words.serve]);
let _ = writeln!(buf, "{line}{http_state}");
}
if !shadowed.contains(&words.http) {
let line = crate::lang::tf("overview.http_mode", &[&words.http]);
let _ = writeln!(buf, "{line}{http_state}");
}
if !shadowed.contains(&words.mcp) {
let line = crate::lang::tf("overview.mcp_mode", &[&words.mcp]);
let mcp_line = if caps.no_mcp {
line + &crate::lang::t("overview.disabled")
} else if !crate::dispatch::mcp_frontend_compiled() {
line + &crate::lang::t("overview.not_compiled")
} else {
line
};
let _ = writeln!(buf, "{mcp_line}");
}
if !shadowed.contains(&words.help) {
let line = crate::lang::tf("overview.help_mode", &[&words.help]);
let _ = writeln!(buf, "{line}");
}
let _ = writeln!(buf, "{}", crate::lang::t("overview.builtins"));
let names = reg.names();
if names.is_empty() || caps.no_cli {
write!(w, "{buf}")?;
return write_block(w, help_after);
}
let _ = writeln!(buf);
let _ = writeln!(buf, "{}", crate::lang::t("overview.commands"));
let width = names.iter().map(|n| n.len()).max().unwrap_or(0);
for n in &names {
let summary = reg.get(n).map(|e| e.summary.clone()).unwrap_or_default();
let _ = writeln!(buf, " {n:<width$} {summary}");
}
write!(w, "{buf}")?;
write_block(w, help_after)
}