use super::parser::{parse_lino, LinoNode};
use super::TERMINAL_COMMANDS_LINO;
#[derive(Debug, Clone, Default)]
pub struct TerminalCommandVocabulary {
pub terminal_phrases: Vec<String>,
pub run_verbs: Vec<String>,
pub cjk_run_verbs: Vec<String>,
pub shell_tokens: Vec<String>,
}
#[must_use]
pub fn terminal_command_vocabulary() -> TerminalCommandVocabulary {
let tree = parse_lino(TERMINAL_COMMANDS_LINO);
let mut vocab = TerminalCommandVocabulary::default();
let Some(root) = tree.children.first() else {
return vocab;
};
for group in &root.children {
match group.name.as_str() {
"terminal_phrases" => vocab.terminal_phrases = collect_language_values(group, "phrase"),
"run_verbs" => vocab.run_verbs = collect_language_values(group, "verb"),
"cjk_run_verbs" => vocab.cjk_run_verbs = collect_values(group, "verb"),
"shell_tokens" => vocab.shell_tokens = collect_values(group, "token"),
_ => {}
}
}
vocab
}
fn collect_values(group: &LinoNode, child_name: &str) -> Vec<String> {
group
.children
.iter()
.filter(|c| c.name == child_name)
.map(|c| c.id.clone())
.collect()
}
fn collect_language_values(group: &LinoNode, child_name: &str) -> Vec<String> {
group
.children
.iter()
.filter(|c| c.name == "language")
.flat_map(|lang| {
lang.children
.iter()
.filter(|c| c.name == child_name)
.map(|c| c.id.clone())
})
.collect()
}