Source code for ReFreSH.MobileSuit.Decorators.SuitArgParser
from typing import Generic, TypeVar, Callable, Optional
from ...CSharp import nameof
from . import DecoratorNames
T = TypeVar('T')
[docs]
class SuitArgParserInfo(Generic[T]):
def __init__(self, parser_name: str = '', converter: Optional[Callable[[str], Optional[T]]] = None):
self.Name = parser_name
self.Converter = converter
[docs]
@classmethod
def FromDecorator(cls, parser_name: str = '', TTarget=None, TConverter=None):
if TTarget is None:
return cls[object](parser_name, None)
if TConverter is None:
TConverter = TTarget
if hasattr(TConverter, parser_name):
return cls[TTarget](parser_name, getattr(TConverter, parser_name))
parse_method_name = f'{parser_name}{nameof(TTarget)}'
if hasattr(TConverter, parse_method_name):
return cls[TTarget](parser_name, getattr(TConverter, parse_method_name))
return cls[TTarget](parser_name, lambda x: TTarget(x))
[docs]
def SuitArgParser(arg_name: str, parser_name: str = '', TTarget=None, TConverter=None):
"""
Select the parser used for the certain argument
"""
def decorator(func):
if not hasattr(func, DecoratorNames.suit_alias):
setattr(func, DecoratorNames.suit_alias, {})
getattr(func, DecoratorNames.suit_alias)[arg_name] = SuitArgParserInfo.FromDecorator(
parser_name, TTarget, TConverter)
return func
return decorator