mmgen-tool: support explicit typing via annotations

This commit is contained in:
The MMGen Project 2022-05-26 16:07:21 +00:00
commit 742a041440
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2

View file

@ -182,28 +182,33 @@ def create_call_sig(cmd,cls,parsed=False):
ann = m.__annotations__
nargs = len(args) - len(dfls)
dfl_types = tuple(
ann[a] if a in ann and isinstance(ann[a],type) else type(dfls[i])
for i,a in enumerate(args[nargs:]) )
def get_type_from_ann(arg):
return ann[arg][1:] + (' or STDIN','')[parsed] if ann[arg] == 'sstr' else ann[arg].__name__
return (
('str' + ('' if parsed else ' or STDIN')) if ann[arg] == 'sstr' else
ann[arg].__name__ )
if parsed:
c_args = [(a,get_type_from_ann(a)) for a in args[:nargs]]
c_kwargs = [(a,dfls[n]) for n,a in enumerate(args[nargs:])]
return (
c_args,
dict(c_kwargs),
'STDIN_OK' if c_args and ann[args[0]] == 'sstr' else flag )
[(a,get_type_from_ann(a)) for a in args[:nargs]], # c_args
dict([(a,dfls[n]) for n,a in enumerate(args[nargs:])]), # c_kwargs
dict([(a,dfl_types[n]) for n,a in enumerate(args[nargs:])]), # c_kwargs_types
('STDIN_OK' if nargs and ann[args[0]] == 'sstr' else flag) ) # flag
else:
c_args = [f'{a} [{get_type_from_ann(a)}]' for a in args[:nargs]]
c_kwargs = ['"{}" [{}={!r}{}]'.format(
a,
type(dfls[n]).__name__, dfls[n],
(' ' + ann[a] if a in ann else '') )
c_kwargs = ['{a} [{b}={c!r}{d}]'.format(
a = a,
b = dfl_types[n].__name__,
c = dfls[n],
d = (' ' + ann[a] if a in ann and isinstance(ann[a],str) else '') )
for n,a in enumerate(args[nargs:])]
return ' '.join(c_args + c_kwargs)
def process_args(cmd,cmd_args,cls):
c_args,c_kwargs,flag = create_call_sig(cmd,cls,parsed=True)
c_args,c_kwargs,c_kwargs_types,flag = create_call_sig(cmd,cls,parsed=True)
have_stdin_input = False
def usage_die(s):
@ -281,7 +286,7 @@ def process_args(cmd,cmd_args,cls):
args = [conv_type(u_args[i],c_args[0][0],c_args[0][1]) for i in range(len(u_args))]
else:
args = [conv_type(u_args[i],c_args[i][0],c_args[i][1]) for i in range(len(c_args))]
kwargs = {k:conv_type(u_kwargs[k],k,type(c_kwargs[k]).__name__) for k in u_kwargs}
kwargs = {k:conv_type(u_kwargs[k],k,c_kwargs_types[k].__name__) for k in u_kwargs}
return ( args, kwargs )