From 461191d2f7b60b98e2705363cacf9651334cfeb0 Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Thu, 26 Oct 2017 08:37:42 -0400 Subject: [PATCH] cli: clean up error handling --- cmd/abci-cli/abci-cli.go | 133 ++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 56 deletions(-) diff --git a/cmd/abci-cli/abci-cli.go b/cmd/abci-cli/abci-cli.go index e098b9a3..294c88cf 100644 --- a/cmd/abci-cli/abci-cli.go +++ b/cmd/abci-cli/abci-cli.go @@ -83,8 +83,7 @@ var RootCmd = &cobra.Command{ var err error client, err = abcicli.NewClient(address, abci, false) if err != nil { - logger.Error(err.Error()) - os.Exit(1) + return err } client.SetLogger(logger.With("module", "abci-client")) if _, err := client.Start(); err != nil { @@ -98,7 +97,7 @@ var RootCmd = &cobra.Command{ func Execute() { addGlobalFlags() addCommands() - RootCmd.Execute() //err? + RootCmd.Execute() } func addGlobalFlags() { @@ -145,7 +144,9 @@ var batchCmd = &cobra.Command{ Use: "batch", Short: "Run a batch of abci commands against an application", Long: "", - Run: cmdBatch, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdBatch(cmd, args) + }, } var consoleCmd = &cobra.Command{ @@ -153,68 +154,88 @@ var consoleCmd = &cobra.Command{ Short: "Start an interactive abci console for multiple commands", Long: "", ValidArgs: []string{"batch", "echo", "info", "set_option", "deliver_tx", "check_tx", "commit", "query"}, - Run: cmdConsole, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdConsole(cmd, args) + }, } var echoCmd = &cobra.Command{ Use: "echo", Short: "Have the application echo a message", Long: "", - Run: cmdEcho, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdEcho(cmd, args) + }, } var infoCmd = &cobra.Command{ Use: "info", Short: "Get some info about the application", Long: "", - Run: cmdInfo, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdInfo(cmd, args) + }, } var setOptionCmd = &cobra.Command{ Use: "set_option", Short: "Set an option on the application", Long: "", - Run: cmdSetOption, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdSetOption(cmd, args) + }, } var deliverTxCmd = &cobra.Command{ Use: "deliver_tx", Short: "Deliver a new transaction to the application", Long: "", - Run: cmdDeliverTx, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdDeliverTx(cmd, args) + }, } var checkTxCmd = &cobra.Command{ Use: "check_tx", Short: "Validate a transaction", Long: "", - Run: cmdCheckTx, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdCheckTx(cmd, args) + }, } var commitCmd = &cobra.Command{ Use: "commit", Short: "Commit the application state and return the Merkle root hash", Long: "", - Run: cmdCommit, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdCommit(cmd, args) + }, } var queryCmd = &cobra.Command{ Use: "query", Short: "Query the application state", Long: "", - Run: cmdQuery, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdQuery(cmd, args) + }, } var counterCmd = &cobra.Command{ Use: "counter", Short: "ABCI demo example", Long: "", - Run: cmdCounter, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdCounter(cmd, args) + }, } var dummyCmd = &cobra.Command{ Use: "dummy", Short: "ABCI demo example", Long: "", - Run: cmdDummy, + RunE: func(cmd *cobra.Command, args []string) error { + return cmdDummy(cmd, args) + }, } // Generates new Args array based off of previous call args to maintain flag persistence @@ -233,95 +254,100 @@ func persistentArgs(line []byte) []string { //-------------------------------------------------------------------------------- -func cmdBatch(cmd *cobra.Command, args []string) { +func cmdBatch(cmd *cobra.Command, args []string) error { bufReader := bufio.NewReader(os.Stdin) for { line, more, err := bufReader.ReadLine() if more { - ifExit(errors.New("Input line is too long")) + return errors.New("Input line is too long") } else if err == io.EOF { break } else if len(line) == 0 { continue } else if err != nil { - ifExit(err) + return err } pArgs := persistentArgs(line) out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() if err != nil { - ifExit(err) + return err } fmt.Println(string(out)) } + return nil } -func cmdConsole(cmd *cobra.Command, args []string) { +func cmdConsole(cmd *cobra.Command, args []string) error { for { fmt.Printf("> ") bufReader := bufio.NewReader(os.Stdin) line, more, err := bufReader.ReadLine() if more { - ifExit(errors.New("Input is too long")) + return errors.New("Input is too long") } else if err != nil { - ifExit(err) + return err } pArgs := persistentArgs(line) out, err := exec.Command(pArgs[0], pArgs[1:]...).Output() if err != nil { - ifExit(err) + return err } fmt.Println(string(out)) } + return nil } // Have the application echo a message -func cmdEcho(cmd *cobra.Command, args []string) { +func cmdEcho(cmd *cobra.Command, args []string) error { if len(args) != 1 { - ifExit(errors.New("Command echo takes only 1 argument")) + return errors.New("Command echo takes only 1 argument") } resEcho := client.EchoSync(args[0]) printResponse(cmd, args, response{ Data: resEcho.Data, }) + return nil } // Get some info from the application -func cmdInfo(cmd *cobra.Command, args []string) { +func cmdInfo(cmd *cobra.Command, args []string) error { var version string if len(args) == 1 { version = args[0] } resInfo, err := client.InfoSync(types.RequestInfo{version}) if err != nil { - ifExit(err) + return err } printResponse(cmd, args, response{ Data: []byte(resInfo.Data), }) + return nil } // Set an option on the application -func cmdSetOption(cmd *cobra.Command, args []string) { +func cmdSetOption(cmd *cobra.Command, args []string) error { if len(args) != 2 { - ifExit(errors.New("Command set_option takes exactly 2 arguments (key, value)")) + return errors.New("Command set_option takes exactly 2 arguments (key, value)") } resSetOption := client.SetOptionSync(args[0], args[1]) printResponse(cmd, args, response{ Log: resSetOption.Log, }) + return nil } // Append a new tx to application -func cmdDeliverTx(cmd *cobra.Command, args []string) { +func cmdDeliverTx(cmd *cobra.Command, args []string) error { if len(args) != 1 { - ifExit(errors.New("Command deliver_tx takes only 1 argument")) + return errors.New("Command deliver_tx takes only 1 argument") } txBytes, err := stringOrHexToBytes(args[0]) if err != nil { - ifExit(err) + return err } res := client.DeliverTxSync(txBytes) printResponse(cmd, args, response{ @@ -329,16 +355,17 @@ func cmdDeliverTx(cmd *cobra.Command, args []string) { Data: res.Data, Log: res.Log, }) + return nil } // Validate a tx -func cmdCheckTx(cmd *cobra.Command, args []string) { +func cmdCheckTx(cmd *cobra.Command, args []string) error { if len(args) != 1 { - ifExit(errors.New("Command check_tx takes only 1 argument")) + return errors.New("Command check_tx takes only 1 argument") } txBytes, err := stringOrHexToBytes(args[0]) if err != nil { - ifExit(err) + return err } res := client.CheckTxSync(txBytes) printResponse(cmd, args, response{ @@ -346,27 +373,29 @@ func cmdCheckTx(cmd *cobra.Command, args []string) { Data: res.Data, Log: res.Log, }) + return nil } // Get application Merkle root hash -func cmdCommit(cmd *cobra.Command, args []string) { +func cmdCommit(cmd *cobra.Command, args []string) error { res := client.CommitSync() printResponse(cmd, args, response{ Code: res.Code, Data: res.Data, Log: res.Log, }) + return nil } // Query application state -func cmdQuery(cmd *cobra.Command, args []string) { +func cmdQuery(cmd *cobra.Command, args []string) error { if len(args) != 1 { - ifExit(errors.New("Command query takes only 1 argument, the query bytes")) + return errors.New("Command query takes only 1 argument, the query bytes") } queryBytes, err := stringOrHexToBytes(args[0]) if err != nil { - ifExit(err) + return err } resQuery, err := client.QuerySync(types.RequestQuery{ @@ -376,7 +405,7 @@ func cmdQuery(cmd *cobra.Command, args []string) { Prove: prove, }) if err != nil { - ifExit(err) + return err } printResponse(cmd, args, response{ Code: resQuery.Code, @@ -388,9 +417,10 @@ func cmdQuery(cmd *cobra.Command, args []string) { Proof: resQuery.Proof, }, }) + return nil } -func cmdCounter(cmd *cobra.Command, args []string) { +func cmdCounter(cmd *cobra.Command, args []string) error { app := counter.NewCounterApplication(serial) @@ -399,13 +429,11 @@ func cmdCounter(cmd *cobra.Command, args []string) { // Start the listener srv, err := server.NewServer(addrC, abci, app) if err != nil { - logger.Error(err.Error()) - os.Exit(1) + return err } srv.SetLogger(logger.With("module", "abci-server")) if _, err := srv.Start(); err != nil { - logger.Error(err.Error()) - os.Exit(1) + return err } // Wait forever @@ -413,9 +441,10 @@ func cmdCounter(cmd *cobra.Command, args []string) { // Cleanup srv.Stop() }) + return nil } -func cmdDummy(cmd *cobra.Command, args []string) { +func cmdDummy(cmd *cobra.Command, args []string) error { logger := log.NewTMLogger(log.NewSyncWriter(os.Stdout)) // Create the application - in memory or persisted to disk @@ -430,13 +459,11 @@ func cmdDummy(cmd *cobra.Command, args []string) { // Start the listener srv, err := server.NewServer(addrD, abci, app) if err != nil { - logger.Error(err.Error()) - os.Exit(1) + return err } srv.SetLogger(logger.With("module", "abci-server")) if _, err := srv.Start(); err != nil { - logger.Error(err.Error()) - os.Exit(1) + return err } // Wait forever @@ -444,6 +471,7 @@ func cmdDummy(cmd *cobra.Command, args []string) { // Cleanup srv.Stop() }) + return nil } //-------------------------------------------------------------------------------- @@ -503,10 +531,3 @@ func stringOrHexToBytes(s string) ([]byte, error) { return []byte(s[1 : len(s)-1]), nil } - -func ifExit(err error) { - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -}