addrfile: use match statement where practicable

This commit is contained in:
The MMGen Project 2025-09-23 09:20:54 +00:00
commit a67bf727d8
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2

View file

@ -27,7 +27,7 @@ from .obj import MMGenObject, TwComment, WalletPassword, MMGenPWIDString
from .seed import SeedID, is_seed_id
from .key import PrivKey
from .addr import ViewKey, AddrListID, MMGenAddrType, MMGenPasswordType, is_addr_idx
from .addrlist import KeyList, AddrListData
from .addrlist import AddrListData
class AddrFile(MMGenObject):
desc = 'addresses'
@ -120,21 +120,22 @@ class AddrFile(MMGenObject):
fs = ' {:<%s} {:<34}{}' % len(str(p.data[-1].idx))
for e in p.data:
c = ' ' + e.comment if add_comments and e.comment else ''
if type(p) is KeyList:
out.append(fs.format(e.idx, f'{p.al_id.mmtype.wif_label}: {e.sec.wif}', c))
elif type(p).__name__ == 'PasswordList':
out.append(fs.format(e.idx, e.passwd, c))
else: # First line with idx
out.append(fs.format(e.idx, e.addr.views[e.addr.view_pref], c))
if p.has_keys:
if self.cfg.b16:
out.append(fs.format('', f'orig_hex: {e.sec.orig_bytes.hex()}', c))
if type(self) is not ViewKeyAddrFile:
out.append(fs.format('', f'{p.al_id.mmtype.wif_label}: {e.sec.wif}', c))
for k in ('viewkey', 'wallet_passwd'):
v = getattr(e, k)
if v:
out.append(fs.format('', f'{k}: {v}', c))
match type(p).__name__:
case 'KeyList':
out.append(fs.format(e.idx, f'{p.al_id.mmtype.wif_label}: {e.sec.wif}', c))
case 'PasswordList':
out.append(fs.format(e.idx, e.passwd, c))
case _: # First line with idx
out.append(fs.format(e.idx, e.addr.views[e.addr.view_pref], c))
if p.has_keys:
if self.cfg.b16:
out.append(fs.format('', f'orig_hex: {e.sec.orig_bytes.hex()}', c))
if type(self) is not ViewKeyAddrFile:
out.append(fs.format('', f'{p.al_id.mmtype.wif_label}: {e.sec.wif}', c))
for k in ('viewkey', 'wallet_passwd'):
v = getattr(e, k)
if v:
out.append(fs.format('', f'{k}: {v}', c))
out.append('}')
self.fmt_data = '\n'.join([l.rstrip() for l in out]) + '\n'
@ -262,24 +263,25 @@ class AddrFile(MMGenObject):
sid = ls.pop(0)
assert is_seed_id(sid), f'{sid!r}: invalid Seed ID'
if type(p).__name__ == 'PasswordList' and len(ls) == 2:
ss = ls.pop().split(':')
assert len(ss) == 2, f'{ss!r}: invalid password length specifier (must contain colon)'
p.set_pw_fmt(ss[0])
p.set_pw_len(ss[1])
p.pw_id_str = MMGenPWIDString(ls.pop())
modname, funcname = p.pw_info[p.pw_fmt].chk_func.split('.')
import importlib
p.chk_func = getattr(importlib.import_module('mmgen.'+modname), funcname)
proto = init_proto(p.cfg, 'btc') # FIXME: dummy protocol
mmtype = MMGenPasswordType(proto, 'P')
elif len(ls) == 1:
proto, mmtype = parse_addrfile_label(ls[0])
elif len(ls) == 0:
proto = init_proto(p.cfg, 'btc')
mmtype = proto.addr_type('L')
else:
raise ValueError(f'{lines[0]}: Invalid first line for {p.gen_desc} file {fn!r}')
match len(ls):
case 2 if type(p).__name__ == 'PasswordList':
ss = ls.pop().split(':')
assert len(ss) == 2, f'{ss!r}: invalid password length specifier (must contain colon)'
p.set_pw_fmt(ss[0])
p.set_pw_len(ss[1])
p.pw_id_str = MMGenPWIDString(ls.pop())
modname, funcname = p.pw_info[p.pw_fmt].chk_func.split('.')
import importlib
p.chk_func = getattr(importlib.import_module('mmgen.'+modname), funcname)
proto = init_proto(p.cfg, 'btc') # FIXME: dummy protocol
mmtype = MMGenPasswordType(proto, 'P')
case 1:
proto, mmtype = parse_addrfile_label(ls[0])
case 0:
proto = init_proto(p.cfg, 'btc')
mmtype = proto.addr_type('L')
case _:
raise ValueError(f'{lines[0]}: Invalid first line for {p.gen_desc} file {fn!r}')
if type(p).__name__ != 'PasswordList':
if proto.base_coin != p.proto.base_coin or proto.network != p.proto.network:
@ -344,15 +346,15 @@ class PasswordFile(AddrFile):
if p.pw_fmt in ('bip39', 'xmrseed'):
ret = lines.pop(0).split(None, p.pw_len + 1)
if len(ret) > p.pw_len+1:
m1 = f'extraneous text {ret[p.pw_len+1]!r} found after password'
m2 = '[bare comments not allowed in BIP39 password files]'
m = m1+' '+m2
elif len(ret) < p.pw_len+1:
m = f'invalid password length {len(ret)-1}'
else:
return (ret[0], ' '.join(ret[1:p.pw_len+1]), '')
raise ValueError(m)
match len(ret) - 1:
case p.pw_len:
return (ret[0], ' '.join(ret[1:p.pw_len + 1]), '')
case x if x > p.pw_len:
raise ValueError(
f'extraneous text {ret[p.pw_len + 1]!r} found after password '
'[bare comments not allowed in mnemonic password files]')
case x if x < p.pw_len:
raise ValueError(f'invalid password length {x}')
else:
ret = lines.pop(0).split(None, 2)
return ret if len(ret) == 3 else ret + ['']