diff options
| author | 2020-02-15 23:31:55 +0000 | |
|---|---|---|
| committer | 2020-02-15 23:31:55 +0000 | |
| commit | dfdde884b8022e0a7c3c7e210eb940ece7c0cfba (patch) | |
| tree | a0eff5888b2975558363c1f53aad1b3a24a9f483 /src | |
| parent | don't call hooks added during event call and don't call ones removed (diff) | |
| signature | ||
implement command spec modifiers, use for `pattern`, use pattern for dice.py
Diffstat (limited to 'src')
| -rw-r--r-- | src/utils/parse/spec.py | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/src/utils/parse/spec.py b/src/utils/parse/spec.py index 407eec0f..e03c8e23 100644 --- a/src/utils/parse/spec.py +++ b/src/utils/parse/spec.py @@ -1,4 +1,4 @@ -import enum, typing +import enum, re, typing from .time import duration from .types import try_int from src.utils.datetime.parse import date_human @@ -17,11 +17,15 @@ class SpecArgumentType(object): context = SpecArgumentContext.ALL def __init__(self, type_name: str, name: typing.Optional[str], - exported: typing.Optional[str]): + modifier: typing.Optional[str], exported: typing.Optional[str]): self.type = type_name self._name = name + self._set_modifier(modifier) self.exported = exported + def _set_modifier(self, modifier: str): + pass + def name(self) -> typing.Optional[str]: return self._name def simple(self, args: typing.List[str]) -> typing.Tuple[typing.Any, int]: @@ -29,6 +33,18 @@ class SpecArgumentType(object): def error(self) -> typing.Optional[str]: return None +class SpecArgumentTypePattern(SpecArgumentType): + _pattern: typing.Pattern + def _set_modifier(self, modifier): + print(modifier) + self._pattern = re.compile(modifier) + def simple(self, args): + match = self._pattern.search(" ".join(args)) + if match: + return match, match.group(0).rstrip(" ").count(" ") + else: + return None, 1 + class SpecArgumentTypeWord(SpecArgumentType): def simple(self, args): if args: @@ -99,7 +115,8 @@ SPEC_ARGUMENT_TYPES = { "tstring": SpecArgumentTypeTrimString, "int": SpecArgumentTypeInt, "date": SpecArgumentTypeDate, - "duration": SpecArgumentTypeDuration + "duration": SpecArgumentTypeDuration, + "pattern": SpecArgumentTypePattern } class SpecArgument(object): @@ -118,10 +135,16 @@ class SpecArgument(object): argument_type_name: typing.Optional[str] = None name_end = argument_type.find(">") - if argument_type.startswith("<") and name_end > 0: + if name_end > 0 and argument_type.startswith("<"): argument_type_name = argument_type[1:name_end] argument_type = argument_type[name_end+1:] + argument_type_modifier: typing.Optional[str] = None + modifier_start = argument_type.find("(") + if modifier_start > 0 and argument_type.endswith(")"): + argument_type_modifier = argument_type[modifier_start+1:-1] + argument_type = argument_type[:modifier_start] + argument_type_class = SpecArgumentType if argument_type in SPEC_ARGUMENT_TYPES: argument_type_class = SPEC_ARGUMENT_TYPES[argument_type] @@ -129,7 +152,7 @@ class SpecArgument(object): argument_type_class = SpecArgumentPrivateType out.append(argument_type_class(argument_type, - argument_type_name, exported)) + argument_type_name, argument_type_modifier, exported)) spec_argument = SpecArgument() spec_argument.optional = optional @@ -165,7 +188,7 @@ class SpecLiteralArgument(SpecArgument): spec_argument = SpecLiteralArgument() spec_argument.optional = optional spec_argument.types = [ - SpecArgumentTypeLiteral("literal", l, None) for l in literals] + SpecArgumentTypeLiteral("literal", l, None, None) for l in literals] return spec_argument def format(self, context: SpecArgumentContext) -> typing.Optional[str]: |
