Browse Source

addrfile: use match statement where practicable

The MMGen Project 2 months ago
parent
commit
a67bf727d8
1 changed files with 45 additions and 43 deletions
  1. 45 43
      mmgen/addrfile.py

+ 45 - 43
mmgen/addrfile.py

@@ -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 + ['']