|
# -*- coding: utf-8 -*- |
|
import parse # todo rename |
|
import actions |
|
from collections import OrderedDict |
|
|
|
|
|
class Parser(object): |
|
def __init__(self): |
|
pass |
|
|
|
def _tokenize(self, strs): |
|
return parse.parse_input_string(strs) |
|
|
|
def _parse(self, tokens): |
|
return parse.parse_command(tokens) |
|
|
|
def __call__(self, strs): |
|
return self._parse(self._tokenize(strs)) |
|
|
|
|
|
class Executor(object): |
|
def __init__(self): |
|
self.actions = OrderedDict() |
|
|
|
def register(self, action, name=None): |
|
name = name or action.__name__ |
|
self.actions[name] = action |
|
|
|
def __call__(self, name, *args, **kwargs): |
|
return self._get_action(name)(*args, **kwargs) |
|
|
|
def _get_action(self, name): |
|
try: |
|
return self.actions[name] |
|
except KeyError: |
|
raise RuntimeError("action:{} is not found".format(name)) |
|
|
|
|
|
class EchoBot(object): |
|
def __init__(self, parser, executor, default_func=actions.echo): |
|
self.parser = parser |
|
self.fn = executor |
|
self.default_fn = default_func |
|
|
|
def do_action(self, ret): |
|
return print(ret) |
|
|
|
def __call__(self, input_string): |
|
return self.evaluate(self.parser(input_string)) |
|
|
|
def evaluate(self, cmds): |
|
ret = '' |
|
while len(cmds) > 0: |
|
_c = cmds.pop(0) |
|
fn_str = _c[0] |
|
args = _c[1:] |
|
try: |
|
ret = self.fn(fn_str, ret, *args) |
|
except RuntimeError: |
|
ret = self.default_fn(''.join(_c)) |
|
return self.do_action(ret) |
|
|
|
|
|
if __name__ == "__main__": |
|
# setup |
|
executor = Executor() |
|
executor.register(actions.echo) |
|
executor.register(actions.moge) |
|
executor.register(actions.whitespace) |
|
executor.register(actions.insert_delimiter) |
|
bot = EchoBot(Parser(), executor) |
|
|
|
# run time |
|
cmd = 'hoge | moge 1 | insert_delimiter ! | whitespace' |
|
bot(cmd) |