1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #!/usr/bin/env python3
- #
- # MMGen Wallet, a terminal-based cryptocurrency wallet
- # Copyright (C)2013-2024 The MMGen Project <mmgen@tuta.io>
- # Licensed under the GNU General Public License, Version 3:
- # https://www.gnu.org/licenses
- # Public project repositories:
- # https://github.com/mmgen/mmgen-wallet
- # https://gitlab.com/mmgen/mmgen-wallet
- """
- tw.shared: classes and functions shared by all tracking wallet classes
- """
- from ..objmethods import HiliteStr,InitErrors,MMGenObject
- from ..obj import TwComment
- from ..addr import MMGenID
- class TwMMGenID(HiliteStr,InitErrors,MMGenObject):
- color = 'orange'
- width = 0
- trunc_ok = False
- def __new__(cls,proto,id_str):
- if isinstance(id_str,cls):
- return id_str
- try:
- ret = addr = disp = MMGenID(proto,id_str)
- sort_key,idtype = (ret.sort_key,'mmgen')
- except Exception as e:
- try:
- coin,addr = id_str.split(':',1)
- assert coin == proto.base_coin.lower(),(
- f'not a string beginning with the prefix {proto.base_coin.lower()!r}:' )
- ret,sort_key,idtype,disp = (id_str,'z_'+id_str,'non-mmgen','non-MMGen')
- addr = proto.coin_addr(addr)
- except Exception as e2:
- return cls.init_fail(e,id_str,e2=e2)
- me = str.__new__(cls,ret)
- me.obj = ret
- me.disp = disp
- me.addr = addr
- me.sort_key = sort_key
- me.type = idtype
- me.proto = proto
- return me
- def fmt(self,**kwargs):
- return super().fmtc(self.disp,**kwargs)
- # non-displaying container for TwMMGenID,TwComment
- class TwLabel(str,InitErrors,MMGenObject):
- exc = 'BadTwLabel'
- passthru_excs = ('BadTwComment',)
- def __new__(cls,proto,text):
- if isinstance(text,cls):
- return text
- try:
- ts = text.split(None,1)
- mmid = TwMMGenID(proto,ts[0])
- comment = TwComment(ts[1] if len(ts) == 2 else '')
- me = str.__new__( cls, mmid + (' ' + comment if comment else '') )
- me.mmid = mmid
- me.comment = comment
- me.proto = proto
- return me
- except Exception as e:
- return cls.init_fail(e,text)
- def get_tw_label(proto,s):
- """
- raise an exception on a malformed comment, return None on an empty or invalid label
- """
- try:
- return TwLabel(proto,s)
- except Exception as e:
- if type(e).__name__ == 'BadTwComment': # do it this way to avoid importing .exception
- raise
- else:
- return None
|