import argparse
import sys
from typing import Callable, Dict, Tuple
from base58 import b58decode, b58decode_check, b58encode, b58encode_check
_fmap = {
(False, False): b58encode,
(False, True): b58encode_check,
(True, False): b58decode,
(True, True): b58decode_check
} # type: Dict[Tuple[bool, bool], Callable[[bytes], bytes]]
def main() -> None:
'''Base58 encode or decode FILE, or standard input, to standard output.'''
stdout = sys.stdout.buffer
parser = argparse.ArgumentParser(description=main.__doc__)
parser.add_argument(
'file',
metavar='FILE',
nargs='?',
type=argparse.FileType('r'),
default='-')
parser.add_argument(
'-d', '--decode',
action='store_true',
help='decode data')
parser.add_argument(
'-c', '--check',
action='store_true',
help='append a checksum before encoding')
args = parser.parse_args()
fun = _fmap[(args.decode, args.check)]
data = args.file.buffer.read()
try:
result = fun(data)
except Exception as e:
sys.exit(e)
stdout.write(result)
if __name__ == '__main__':
main()