ff2a47af创建于 2024年12月13日历史提交
import abc
import re
from collections import defaultdict
from string import Template
from typing import Tuple, Dict


class CmdEvent:

    @abc.abstractmethod
    def execute(self, parse_cmd_dict) -> Tuple[int, str]:
        pass


class MockCmdPattern:

    def __init__(self, cmd: str):
        self.cmd = cmd
        self._cmd_pattern = re.compile(cmd)

    @abc.abstractmethod
    def parse(self, cmd, extend_data: Dict = None) -> Tuple[bool, Tuple[int, str]]:
        pass

    def _parse_cmd(self, cmd):
        search_res = self._cmd_pattern.search(cmd)
        if not search_res:
            return False, {}
        return True, search_res.groupdict()


class MockCmdTemplatePattern(MockCmdPattern):

    def __init__(self, cmd: str, code: int = 0, output: str = ""):
        super().__init__(cmd)
        self.code = code
        self.output_pattern = Template(output)

    def parse(self, cmd, extend_data: Dict = None):
        res, parse_dict = self._parse_cmd(cmd)
        if not res:
            return False, (-1, "")
        parse_dict.update(extend_data or {})
        return True, (self.code, self.output_pattern.safe_substitute(defaultdict(str, parse_dict)))


class MockCmdEventPattern(MockCmdPattern):

    def __init__(self, cmd: str, event):
        super().__init__(cmd)
        self.event = event

    def parse(self, cmd, extend_data: Dict = None):
        res, parse_dict = self._parse_cmd(cmd)
        if not res:
            return False, (-1, "")
        event_executor = extend_data.get(self.event)
        if not event_executor:
            raise Exception(f"Event: {self.event} not existed.")
        return True, event_executor.execute(parse_dict)