#[derive(Debug, Clone, PartialEq)]
pub enum ReplCommand {
Empty,
Comment,
Quit,
Invoke {
module: String,
args: toml::Value,
},
Unknown(String),
}
pub fn parse_line(s: &str) -> ReplCommand {
let trimmed = s.trim();
if trimmed.is_empty() {
return ReplCommand::Empty;
}
if trimmed.starts_with('#') {
return ReplCommand::Comment;
}
let lower = trimmed.to_ascii_lowercase();
if lower == "quit" || lower == "exit" {
return ReplCommand::Quit;
}
let mut iter = trimmed.split_whitespace();
let module = match iter.next() {
Some(m) => m.to_string(),
None => return ReplCommand::Empty,
};
let mut table = toml::map::Map::new();
for token in iter {
if let Some((k, v)) = token.split_once('=') {
table.insert(k.to_string(), toml::Value::String(v.to_string()));
}
}
ReplCommand::Invoke {
module,
args: toml::Value::Table(table),
}
}