use crate::poem::Verse; use std::collections::BTreeMap; use std::collections::HashMap; /// alias /// /// The builtin `alias` command. Used to monikers for other verbs, or entire /// verses. /// /// # Shell Example /// ```sh /// alias vim=nvim /// ``` pub fn incant(verse: &Verse, out: &mut Vec, aliases: &mut HashMap) -> i32 { match verse.clause() { Some(clause) => { for stanza in clause { let (key, val) = match stanza.split_once("=") { Some((key, val)) => (key, val), None => continue, }; aliases.insert(String::from(key), String::from(val)); } } None => { let mut lines = Vec::new(); let sorted: BTreeMap<_, _> = aliases.into_iter().collect(); for (key, val) in sorted { let line = if key.contains(' ') && val.contains(' ') { format!("'{}'='{}'", key, val) } else if key.contains(' ') { format!("'{}'={}", key, val) } else if val.contains(' ') { format!("{}='{}'", key, val) } else if val.is_empty() { format!("{}=''", key) } else { format!("{}={}", key, val) }; lines.push(line); } if verse.couplet > 0 { *out = format!("{}\n", lines.join("\n")).as_bytes().to_vec(); } else { println!("{}", lines.join("\n")); } } } 0 } /// unalias /// /// The builtin `unalias` command. Used to remove shell monikers, since `alias` /// may be called with an empty string as the value. /// /// # Shell Example /// ```sh /// unalias vim /// ``` pub fn unincant(verse: &Verse, aliases: &mut HashMap) -> i32 { match verse.clause() { Some(clause) => { for stanza in clause { aliases.remove(&stanza); } } None => { eprintln!("unalias: not enough arguments"); return 1; } } 0 }