aboutsummaryrefslogtreecommitdiffstats
path: root/natargs.py
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2021-07-25 11:33:43 -0400
committerGravatar - 2021-07-26 22:55:41 -0400
commit633cf0fcd438ad0dfb05cfaf7f7127b525d8c52f (patch)
tree130025d8687ad233200ebd727368a10d11fc623d /natargs.py
parentadd inspect_tagmap.md (diff)
underwriter: start new argument parser
Diffstat (limited to 'natargs.py')
-rw-r--r--natargs.py59
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 = {}