Source code for ReFreSH.MobileSuit.Core.Services.ParsingService
from typing import Callable, Dict, Type, TypeVar
from json import loads as deserialize
from abc import ABC, abstractmethod
from ..SuitParser import SuitParser
T = TypeVar('T')
[docs]
class IParsingService(ABC):
"""
Get parsers for certain type.
"""
[docs]
@abstractmethod
def Get(self, type: Type, name: str = "") -> Callable[[str], object]:
"""
Get a parser for certain type with certain name.
:param type: certain type
:param name: certain name
:return:
"""
raise NotImplementedError
[docs]
@abstractmethod
def Add(self, _T, converter: Callable[[str], T], name: str = "") -> None:
"""
Add a parser with certain name to parsing service.
:param _T:
:param converter:
:param name:
"""
raise NotImplementedError
[docs]
@abstractmethod
def AddParser(self, parser: SuitParser[T]) -> None:
"""
Add a parser.
:param parser:
"""
raise NotImplementedError
[docs]
@abstractmethod
def AddName(self, _T:Type, name: str = "") -> None:
"""
Add a parser.
:param _T:
:param name:
"""
raise NotImplementedError
[docs]
class ParsingService(IParsingService):
def __init__(self):
self._parsers: Dict[Type, Dict[str, Callable[[str], object]]] = {}
self.AddName(int)
self.AddName(float)
self.AddName(bool)
[docs]
def Add(self, _T: Type, converter: Callable[[str], T], name: str = "") -> None:
self.AddParser(SuitParser.FromConverter(_T, converter, name))
[docs]
def AddParser(self, parser: SuitParser[T]) -> None:
if not parser.TargetType in self._parsers:
self._parsers[parser.TargetType] = {}
if parser.Name in self._parsers[parser.TargetType]:
del self._parsers[parser.TargetType][parser.Name]
self._parsers[parser.TargetType][parser.Name] = parser.Parser
[docs]
def AddName(self, _T: Type, name: str = "") -> None:
self.AddParser(SuitParser.FromName(_T, name))
[docs]
def Get(self, type: Type, name: str = "") -> Callable[[str], object]:
if type in self._parsers and name in self._parsers[type]:
return self._parsers[type][name]
return lambda s: deserialize(s)