use std::collections::BTreeMap;
use crate::CommandNode;
pub fn visit_command_tree(
map: &BTreeMap<String, CommandNode>,
prefix: &[String],
visit: &mut dyn FnMut(&[String], &CommandNode),
) {
for (name, node) in map {
let mut chain = prefix.to_vec();
chain.push(name.clone());
visit(&chain, node);
if !node.commands.is_empty() {
visit_command_tree(&node.commands, &chain, visit);
}
}
}
pub fn shell_dialect_label(shell: &str) -> &'static str {
match shell {
"zsh" => "zsh",
"bash" => "bash",
_ => "POSIX sh",
}
}
pub fn generated_shell_header(tool: &str, shell: &str, requires_line: &str) -> String {
format!(
"# generated by `{tool}` ({})\n{requires_line}\n",
shell_dialect_label(shell)
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn header_matches_dialect() {
assert_eq!(
generated_shell_header("jan alias", "zsh", "# requires: jan use <DIR>"),
"# generated by `jan alias` (zsh)\n# requires: jan use <DIR>\n"
);
assert!(generated_shell_header("jan config emit", "sh", "# x").contains("(POSIX sh)"));
}
}