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 }