use std::collections::BTreeMap;
use super::compile::compile_with_prefixes;
use super::expand;
fn make_case(prefix: &str, compiled: &BTreeMap<&str, &str>) {
println!("function {}() {{", prefix);
println!(" case $* in");
for (short, long) in compiled {
let words = short.split_ascii_whitespace().collect::<Vec<_>>();
if words.len() != 2 {
continue;
}
println!(" {}) shift 1; command {long} \"$@\" ;;", words[1]);
}
println!(" *) command {prefix} \"$@\"");
println!(" esac");
println!("}}");
}
pub(super) fn go(conf: expand::ConfigFile) {
let mut compiled = compile_with_prefixes(&conf.cmds, "", true)
.into_iter()
.collect::<Vec<_>>();
compiled.sort();
for (cmd_long, cmd) in conf.cmds.0 {
let mut multi_word = BTreeMap::new();
for (short, long) in &compiled {
let long = long.trim_end();
if !long.starts_with(&cmd_long) {
continue;
}
if *short != cmd.short && !short.contains(' ') {
println!("alias {short}=\"{long}\"");
} else if short.starts_with(&cmd_long) {
multi_word.insert(short.as_str(), long);
}
}
make_case(&cmd_long, &multi_word);
println!("function {}() {{ {cmd_long} \"$@\"; }}", cmd.short)
}
}