new object $has_commands: $root;
var $has_commands commands = 0;
var $has_commands shortcuts = 0;
var $root inited = 1;
public method .commands() {
return commands || [];
};
public method .match_command() {
arg line;
var cmd, char, word;
// First try to match the shortcuts (quick)
char = line[1] in .shortcuts().slice(1);
if (char) {
cmd = .shortcuts()[char];
return [cmd[2], cmd[1], line.subrange(2)];
}
// Now try to match an actual command
word = substr(line, 1, stridx(line, " ", 1)-1);
for cmd in (.commands()) {
if (word == cmd[1]) {
return [cmd[2], word, @line.explode().subrange(2)];
}
}
// No match
return ['invalid_cmd];
};
public method .shortcuts() {
return shortcuts || [];
};