feat: operator arguments
This commit is contained in:
parent
b8451b3171
commit
20d0424930
1 changed files with 33 additions and 13 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import re
|
||||
import sys
|
||||
import locale
|
||||
import logging
|
||||
|
|
@ -42,8 +43,8 @@ class format:
|
|||
return items
|
||||
|
||||
class trim(Format):
|
||||
def __init__(self, max = 14):
|
||||
self.max = max
|
||||
def __init__(self, max = "14"):
|
||||
self.max = int(max)
|
||||
|
||||
def trim(self, line):
|
||||
if len(line) > self.max:
|
||||
|
|
@ -158,6 +159,23 @@ def classes_of(namespace):
|
|||
subs = {cls.__name__:cls for cls in itf.__subclasses__()}
|
||||
return subs
|
||||
|
||||
def operator(asked_op):
|
||||
logger.debug(f"├ Parsed operators:")
|
||||
for op in asked_op:
|
||||
# We do not use a f(a) notation,
|
||||
# because the shell would try to interpret
|
||||
# any unescaped/unquoted parentheses.
|
||||
# It is faster to use f:a for the user.
|
||||
m = re.match("(\w+):(.+)", op)
|
||||
if m:
|
||||
name = m.group(1)
|
||||
args = [a.strip() for a in m.group(2).split(',')]
|
||||
else:
|
||||
name = op
|
||||
args = []
|
||||
logger.debug(f"│ ├ {name}({','.join(args)})")
|
||||
yield name,args
|
||||
logger.debug("│ └OK")
|
||||
|
||||
def main():
|
||||
errors = {"NO_ERROR":0, "UNKNOWN_ERROR":1, "NO_SETUP_NEEDED":2, "NO_APP_KEY":10}
|
||||
|
|
@ -169,31 +187,31 @@ def main():
|
|||
|
||||
streamers = classes_of(stream)
|
||||
parser.add_argument("-s", "--stream",
|
||||
choices = streamers.keys(),
|
||||
# metavar = "STREAMER(S)",
|
||||
# choices = streamers.keys(),
|
||||
metavar = '{' + ','.join(streamers) + '}',
|
||||
default = [],
|
||||
action="append",
|
||||
help="Where to get items.")
|
||||
|
||||
consumers = classes_of(consume)
|
||||
parser.add_argument("-c", "--consume",
|
||||
choices = consumers.keys(),
|
||||
# metavar = "CONSUMER",
|
||||
# choices = consumers.keys(),
|
||||
metavar = '{' + ','.join(consumers) + '}',
|
||||
default = "lines",
|
||||
help="How to get the content form items.")
|
||||
|
||||
formaters = classes_of(format)
|
||||
parser.add_argument("-f", "--format",
|
||||
choices = formaters.keys(),
|
||||
# metavar = "FORMATER(S)",
|
||||
# choices = formaters.keys(),
|
||||
metavar = '{' + ','.join(formaters) + '}',
|
||||
default = [],
|
||||
action="append",
|
||||
help="How to format items.")
|
||||
|
||||
lifters = classes_of(lift)
|
||||
parser.add_argument("-l", "--lift",
|
||||
choices = lifters.keys(),
|
||||
# metavar = "LIFTER(S)",
|
||||
# choices = lifters.keys(),
|
||||
metavar = '{' + ','.join(lifters) + '}',
|
||||
default = [],
|
||||
action="append",
|
||||
help="How to lift items.")
|
||||
|
|
@ -210,6 +228,8 @@ def main():
|
|||
logger.debug(f"├ formaters: {', '.join(formaters)}")
|
||||
logger.debug(f"└ lifters: {', '.join(lifters)}")
|
||||
|
||||
# Sane defaults. Cannot be a default in argparse,
|
||||
# because choices would be append to it.
|
||||
if not asked.stream:
|
||||
asked.stream = ["stdin"]
|
||||
|
||||
|
|
@ -222,9 +242,9 @@ def main():
|
|||
logger.debug("Chosen operators:")
|
||||
forthlift = Forthlifter(
|
||||
consumer = consumers[asked.consume](),
|
||||
streamers = [streamers[k]() for k in asked.stream],
|
||||
formatters = [formaters[k]() for k in asked.format],
|
||||
lifters = [ lifters[k]() for k in asked.lift ],
|
||||
streamers = [streamers[op](*args) for op,args in operator(asked.stream)],
|
||||
formatters = [formaters[op](*args) for op,args in operator(asked.format)],
|
||||
lifters = [ lifters[op](*args) for op,args in operator(asked.lift )],
|
||||
)
|
||||
logger.debug("Run:")
|
||||
forthlift()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue