github.com/harveynw/blokechain@v0.0.0-20221114193833-615a6ea7bba4/cmd/wallet/wallet.go (about)

     1  package main
     2  
     3  import (
     4  	"errors"
     5  	"flag"
     6  	"fmt"
     7  	"os"
     8  	"text/tabwriter"
     9  	"github.com/harveynw/blokechain/internal/wallet"
    10  )
    11  
    12  // ErrTooManyArguments when overspecified
    13  var ErrTooManyArguments = errors.New("Too many arguments")
    14  
    15  // Option defines a wallet CLI command
    16  type Option struct {
    17  	handler func()
    18  	triggered *bool
    19  	description string
    20  }
    21  
    22  func newOption(command string, handler func(), description string) Option {
    23  	f := flag.Bool(command, false, description)
    24  	return Option{handler: handler, triggered: f, description: description}
    25  }
    26  
    27  var options = []Option {
    28  	newOption("g", newAddress, "Generate a new address"),
    29  	newOption("ls", listAddresses, "List addresses"),
    30  	newOption("b", listBalances, "List balances of addresses"),
    31  }
    32  
    33  func main() {
    34  	flag.Parse()
    35  	assertSingleArgument()
    36  
    37  	for _, option := range options {
    38  		if *option.triggered {
    39  			option.handler()
    40  			break
    41  		}
    42  	}
    43  }
    44  
    45  func assertSingleArgument() {
    46  	if flag.NArg() + flag.NFlag() != 1 {
    47  		fmt.Println(ErrTooManyArguments)
    48  		os.Exit(0)
    49  	}
    50  }
    51  
    52  func newAddress() {
    53  	assertSingleArgument()
    54  
    55  	addr := wallet.Load().GenerateNew()
    56  	fmt.Println(addr)
    57  }
    58  
    59  func listAddresses() {
    60  	assertSingleArgument()
    61  
    62  	addresses := wallet.Load().Addresses
    63  	for _, addr := range addresses {
    64  		fmt.Println(addr.PublicKey.ToAddress())
    65  	}
    66  }
    67  
    68  func listBalances() {
    69  	assertSingleArgument()
    70  
    71  	fmt.Printf("Gathering UXTOs from nodes...\n\n")
    72  	fmt.Println("Total Balance : 0 BTC")
    73  	w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', tabwriter.Debug)
    74  	fmt.Fprintln(w, "\t\033[1mAddress\033[0m\t\033[1mBalance\033[0m\t")
    75  
    76  	addresses := wallet.Load().Addresses
    77  	for _, addr := range addresses {
    78  		fmt.Fprintln(w, "\t\033[0m" + addr.PublicKey.ToAddress() + "\033[0m\t\033[0m0\033[0m\t")
    79  	}
    80  	w.Flush()
    81  }