From e70b5fa71ac7d588a482fd824e792868d1097fc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Pluta?= Date: Sat, 13 Jul 2019 23:08:17 +0200 Subject: [PATCH] Add 'optional' matcher --- smnp/function/signature.py | 11 ++++++++++- smnp/type/signature/matcher/model.py | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/smnp/function/signature.py b/smnp/function/signature.py index ad23caf..c94782b 100644 --- a/smnp/function/signature.py +++ b/smnp/function/signature.py @@ -12,6 +12,9 @@ class Signature: def varargSignature(varargMatcher, *basicSignature, wrapVarargInValue=False): def check(args): + if any([ matcher.optional for matcher in [ varargMatcher, *basicSignature ]]): + raise RuntimeError("Vararg signature can't have optional arguments") + if len(basicSignature) > len(args): return doesNotMatchVararg(basicSignature) @@ -38,7 +41,7 @@ def doesNotMatchVararg(basicSignature): def signature(*signature): def check(args): - if len(signature) != len(args): + if len(args) not in [len(signature), len([ matcher for matcher in signature if not matcher.optional ])]: return doesNotMatch(signature) for s, a in zip(signature, args): @@ -52,6 +55,12 @@ def signature(*signature): return Signature(check, string, signature) +def optional(matcher): + matcher.optional = True + matcher.string += "?" + return matcher + + def doesNotMatch(sign): return (False, *[None for n in sign]) diff --git a/smnp/type/signature/matcher/model.py b/smnp/type/signature/matcher/model.py index 4e68860..17535ad 100644 --- a/smnp/type/signature/matcher/model.py +++ b/smnp/type/signature/matcher/model.py @@ -3,6 +3,7 @@ class Matcher: self.type = objectType self.matcher = matcher self.string = string + self.optional = False def match(self, value): if self.type is not None and self.type != value.type: