diff options
| author | 2021-07-25 11:33:43 -0400 | |
|---|---|---|
| committer | 2021-07-26 22:55:41 -0400 | |
| commit | 633cf0fcd438ad0dfb05cfaf7f7127b525d8c52f (patch) | |
| tree | 130025d8687ad233200ebd727368a10d11fc623d /natargs.py | |
| parent | add inspect_tagmap.md (diff) | |
underwriter: start new argument parser
Diffstat (limited to 'natargs.py')
| -rw-r--r-- | natargs.py | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/natargs.py b/natargs.py new file mode 100644 index 0000000..8e96d2c --- /dev/null +++ b/natargs.py @@ -0,0 +1,59 @@ +########################################################################### +# +########################################################################### + +class DuplicateArgumentException: + def __str__(self): + return f"{self.oldargs} already exists" + def __init__(self, oldargs): + self.oldargs = oldargs + +class TrieElem: + def dochk(self, l): + return True if self.chk is None \ + else self.chk(len(l)) + + def __init__(self, chk, f, st): + self.chk = chk + self.f = f + self.st = st + +def addargs(dic, oldargs, args, chk, f): + if len(args) == 1: + if args[0] in dic: + raise DuplicateArgumentException(oldargs) + else: + dic[args[0]] = TrieElem(chk,f,{}) + else: + if args[0] not in dic: + dic[args[0]] = TrieElem(None, None, {}) + dic[args[0]].st = addargs(dic[args[0]].st, \ + oldargs, args[1:], chk, f) + return dic + +def getarg(dict, l): + if len(l) == 0 or l[0] not in dict: + return None + else: + resolved = getarg(dict[l[0]].st, l[1:]) + if resolved is None: + return dict[l[0]].f,l[1:] \ + if dict[l[0]].dochk(l[1:]) \ + else None + else: + return resolved + +class Arguments: + def execarg(self, args): + res = getarg(self.trie, args) + if res is None: + raise Exception + return res[0](res[1]) + + def addarg(self, args, chk, f): + if args == []: + raise ValueError + self.trie = addargs(self.trie, args, args, chk, f) + + def __init__(self): + self.trie = {} |
