From 169d22154d0ea2a8d4ee9ef738ae2076f5a2feb1 Mon Sep 17 00:00:00 2001
From: Benjamin Bollen <ben@erisindustries.com>
Date: Tue, 2 Aug 2016 15:33:27 +0200
Subject: [PATCH] client: make cli structure compile

---
 client/cmd/eris-client.go         |   4 +-
 client/cmd/transaction.go         | 134 +++++++++++++++++++-----------
 client/transaction/transaction.go |  20 ++---
 definitions/client_do.go          |  76 ++++++++---------
 4 files changed, 137 insertions(+), 97 deletions(-)

diff --git a/client/cmd/eris-client.go b/client/cmd/eris-client.go
index 6df5e2a0..dd960f6d 100644
--- a/client/cmd/eris-client.go
+++ b/client/cmd/eris-client.go
@@ -21,9 +21,9 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/spf13/cobra13"
+	"github.com/spf13/cobra"
 
-	"github.com/eris-ltd/eris-logger"
+	log "github.com/eris-ltd/eris-logger"
 
 	"github.com/eris-ltd/eris-db/definitions"
 	"github.com/eris-ltd/eris-db/version"
diff --git a/client/cmd/transaction.go b/client/cmd/transaction.go
index 70d56c9f..1106dab0 100644
--- a/client/cmd/transaction.go
+++ b/client/cmd/transaction.go
@@ -18,28 +18,35 @@ package commands
 
 import (
 	"strings"
-	cobra "github.com/spf13/cobra"
+	"os"
+
+	"github.com/spf13/cobra"
+
+	log "github.com/eris-ltd/eris-logger"
+
+	"github.com/eris-ltd/eris-db/client/transaction"
 )
 
-var TransactionCmd = &cobra.Command(
+var TransactionCmd = &cobra.Command{
 	Use:   "tx",
 	Short: "eris-client tx formulates and signs a transaction to a chain",
-	Long:  `eris-client tx formulates and signs a transaction to a chain`,
+	Long:  `eris-client tx formulates and signs a transaction to a chain.
+`,
 	Run:   func(cmd *cobra.Command, args []string) { cmd.Help() },
 	PersistentPreRun: func(cmd *cobra.Command, args []string) {
 		// 
-		if !strings.HasPrefix(clientDo.nodeAddrFlag, "http://") {
-			clientDo.nodeAddrFlag = "http://" + clientDo.nodeAddrFlag
+		if !strings.HasPrefix(clientDo.NodeAddrFlag, "http://") {
+			clientDo.NodeAddrFlag = "http://" + clientDo.NodeAddrFlag
 		}
-		if !strings.HasSuffix(clientDo.nodeAddrFlag, "/") {
-			clientDo.nodeAddrFlag += "/"
+		if !strings.HasSuffix(clientDo.NodeAddrFlag, "/") {
+			clientDo.NodeAddrFlag += "/"
 		}
 
-		if !strings.HasPrefix(clientDo.signAddrFlag, "http://") {
-			ClientDo.signAddrFlag = "http://" + clientDo.signAddrFlag
+		if !strings.HasPrefix(clientDo.SignAddrFlag, "http://") {
+			clientDo.SignAddrFlag = "http://" + clientDo.SignAddrFlag
 		}
 	},
-)
+}
 
 func buildTransactionCommand() {
 	// Transaction command has subcommands send, name, call, bond,
@@ -52,89 +59,112 @@ func buildTransactionCommand() {
 		Use:   "send",
 		Short: "eris-client tx send --amt <amt> --to <addr>",
 		Long:  "eris-client tx send --amt <amt> --to <addr>",
-		Run:   cliSend,	
+		Run:   func(cmd *cobra.Command, args []string) {
+			transaction.Send(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	sendCmd.Flags().StringVarP(&clientDo.amtFlag, "amt", "a", "", "specify an amount")
-	sendCmd.Flags().StringVarP(&clientDo.toFlag, "to", "t", "", "specify an address to send to")
+	sendCmd.Flags().StringVarP(&clientDo.AmtFlag, "amt", "a", "", "specify an amount")
+	sendCmd.Flags().StringVarP(&clientDo.ToFlag, "to", "t", "", "specify an address to send to")
 
 	// NameTx
 	var nameCmd = &cobra.Command{
 		Use:   "name",
 		Short: "eris-client tx name --amt <amt> --name <name> --data <data>",
 		Long:  "eris-client tx name --amt <amt> --name <name> --data <data>",
-		Run:   cliName,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Name(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	nameCmd.Flags().StringVarP(&clientDo.amtFlag, "amt", "a", "", "specify an amount")
-	nameCmd.Flags().StringVarP(&clientDo.nameFlag, "name", "n", "", "specify a name")
-	nameCmd.Flags().StringVarP(&clientDo.dataFlag, "data", "d", "", "specify some data")
-	nameCmd.Flags().StringVarP(&clientDo.dataFileFlag, "data-file", "", "", "specify a file with some data")
-	nameCmd.Flags().StringVarP(&clientDo.feeFlag, "fee", "f", "", "specify the fee to send")
+	nameCmd.Flags().StringVarP(&clientDo.AmtFlag, "amt", "a", "", "specify an amount")
+	nameCmd.Flags().StringVarP(&clientDo.NameFlag, "name", "n", "", "specify a name")
+	nameCmd.Flags().StringVarP(&clientDo.DataFlag, "data", "d", "", "specify some data")
+	nameCmd.Flags().StringVarP(&clientDo.DataFileFlag, "data-file", "", "", "specify a file with some data")
+	nameCmd.Flags().StringVarP(&clientDo.FeeFlag, "fee", "f", "", "specify the fee to send")
 
 	// CallTx
 	var callCmd = &cobra.Command{
 		Use:   "call",
 		Short: "eris-client tx call --amt <amt> --fee <fee> --gas <gas> --to <contract addr> --data <data>",
 		Long:  "eris-client tx call --amt <amt> --fee <fee> --gas <gas> --to <contract addr> --data <data>",
-		Run:   cliCall,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Call(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	callCmd.Flags().StringVarP(&clientDo.amtFlag, "amt", "a", "", "specify an amount")
-	callCmd.Flags().StringVarP(&clientDo.toFlag, "to", "t", "", "specify an address to send to")
-	callCmd.Flags().StringVarP(&clientDo.dataFlag, "data", "d", "", "specify some data")
-	callCmd.Flags().StringVarP(&clientDo.feeFlag, "fee", "f", "", "specify the fee to send")
-	callCmd.Flags().StringVarP(&clientDo.gasFlag, "gas", "g", "", "specify the gas limit for a CallTx")
+	callCmd.Flags().StringVarP(&clientDo.AmtFlag, "amt", "a", "", "specify an amount")
+	callCmd.Flags().StringVarP(&clientDo.ToFlag, "to", "t", "", "specify an address to send to")
+	callCmd.Flags().StringVarP(&clientDo.DataFlag, "data", "d", "", "specify some data")
+	callCmd.Flags().StringVarP(&clientDo.FeeFlag, "fee", "f", "", "specify the fee to send")
+	callCmd.Flags().StringVarP(&clientDo.GasFlag, "gas", "g", "", "specify the gas limit for a CallTx")
 
 	// BondTx
 	var bondCmd = &cobra.Command{
 		Use:   "bond",
 		Short: "eris-client tx bond --pubkey <pubkey> --amt <amt> --unbond-to <address>",
 		Long:  "eris-client tx bond --pubkey <pubkey> --amt <amt> --unbond-to <address>",
-		Run:   cliBond,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Bond(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	bondCmd.Flags().StringVarP(&clientDo.amtFlag, "amt", "a", "", "specify an amount")
-	bondCmd.Flags().StringVarP(&clientDo.unbondtoFlag, "to", "t", "", "specify an address to unbond to")
+	bondCmd.Flags().StringVarP(&clientDo.AmtFlag, "amt", "a", "", "specify an amount")
+	bondCmd.Flags().StringVarP(&clientDo.UnbondtoFlag, "to", "t", "", "specify an address to unbond to")
 
 	// UnbondTx
 	var unbondCmd = &cobra.Command{
 		Use:   "unbond",
 		Short: "eris-client tx unbond --addr <address> --height <block_height>",
 		Long:  "eris-client tx unbond --addr <address> --height <block_height>",
-		Run:   cliUnbond,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Unbond(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	unbondCmd.Flags().StringVarP(&clientDo.addrFlag, "addr", "a", "", "specify an address")
-	unbondCmd.Flags().StringVarP(&clientDo.heightFlag, "height", "n", "", "specify a height to unbond at")
+	unbondCmd.Flags().StringVarP(&clientDo.AddrFlag, "addr", "a", "", "specify an address")
+	unbondCmd.Flags().StringVarP(&clientDo.HeightFlag, "height", "n", "", "specify a height to unbond at")
 
 	// RebondTx
 	var rebondCmd = &cobra.Command{
 		Use:   "rebond",
 		Short: "eris-client tx rebond --addr <address> --height <block_height>",
 		Long:  "eris-client tx rebond --addr <address> --height <block_height>",
-		Run:   cliRebond,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Rebond(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	rebondCmd.Flags().StringVarP(&clientDo.addrFlag, "addr", "a", "", "specify an address")
-	rebondCmd.Flags().StringVarP(&clientDo.heightFlag, "height", "n", "", "specify a height to unbond at")
+	rebondCmd.Flags().StringVarP(&clientDo.AddrFlag, "addr", "a", "", "specify an address")
+	rebondCmd.Flags().StringVarP(&clientDo.HeightFlag, "height", "n", "", "specify a height to unbond at")
 
 	// PermissionsTx
 	var permissionsCmd = &cobra.Command{
 		Use:   "permission",
 		Short: "eris-client tx perm <function name> <args ...>",
 		Long:  "eris-client tx perm <function name> <args ...>",
-		Run:   cliPermissions,
+		Run:   func(cmd *cobra.Command, args []string) {
+			// transaction.Permsissions(clientDo)
+		},
+		PersistentPreRun: assertChainIdSet,
 	}
-	permissionsCmd.Flags().StringVarP(&clientDo.addrFlag, "addr", "a", "", "specify an address")
-	permissionsCmd.Flags().StringVarP(&clientDo.heightFlag, "height", "n", "", "specify a height to unbond at")
+	permissionsCmd.Flags().StringVarP(&clientDo.AddrFlag, "addr", "a", "", "specify an address")
+	permissionsCmd.Flags().StringVarP(&clientDo.HeightFlag, "height", "n", "", "specify a height to unbond at")
+
+	TransactionCmd.AddCommand(sendCmd, nameCmd, callCmd, bondCmd, unbondCmd, rebondCmd, permissionsCmd)
 }
 
 func addTransactionPersistentFlags() {
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.signAddrFlag, "sign-addr", "", defaultKeyDaemonAddr, "set eris-keys daemon address (default respects $ERIS_CLIENT_SIGN_ADDRESS)")
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.nodeAddrFlag, "node-addr", "", DefaultNodeRPCAddr, "set the eris-db node rpc server address (default respects $ERIS_CLIENT_NODE_ADDRESS)")
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.pubkeyFlag, "pubkey", "", defaultPublicKey, "specify the public key to sign with (defaults to $ERIS_CLIENT_PUBLIC_KEY)")
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.addrFlag, "addr", "", defaultAddress, "specify the account address (from which the public key can be fetch from eris-keys) (default respects $ERIS_CLIENT_ADDRESS)")
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.chainidFlag, "chain-id", "", defaultChainID, "specify the chainID (default respects $CHAIN_ID)")
-	ErisClientCmd.PersistentFlags().StringVarP(&clientDo.nonceFlag, "nonce", "", "", "specify the nonce to use for the transaction (should equal the sender account's nonce + 1)")
-
-	// ErisClientCmd.PersistentFlags().BoolVarP(&signFlag, "sign", "s", false, "sign the transaction using the eris-keys daemon")
-	ErisClientCmd.PersistentFlags().BoolVarP(&clientDo.broadcastFlag, "broadcast", "b", false, "broadcast the transaction to the blockchain")
-	ErisClientCmd.PersistentFlags().BoolVarP(&clientDo.waitFlag, "wait", "w", false, "wait for the transaction to be committed in a block")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.SignAddrFlag, "sign-addr", "", defaultKeyDaemonAddress(), "set eris-keys daemon address (default respects $ERIS_CLIENT_SIGN_ADDRESS)")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.NodeAddrFlag, "node-addr", "", defaultNodeRpcAddress(), "set the eris-db node rpc server address (default respects $ERIS_CLIENT_NODE_ADDRESS)")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.PubkeyFlag, "pubkey", "", defaultPublicKey(), "specify the public key to sign with (defaults to $ERIS_CLIENT_PUBLIC_KEY)")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.AddrFlag, "addr", "", defaultAddress(), "specify the account address (from which the public key can be fetch from eris-keys) (default respects $ERIS_CLIENT_ADDRESS)")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.ChainidFlag, "chain-id", "", defaultChainId(), "specify the chainID (default respects $CHAIN_ID)")
+	TransactionCmd.PersistentFlags().StringVarP(&clientDo.NonceFlag, "nonce", "", "", "specify the nonce to use for the transaction (should equal the sender account's nonce + 1)")
+
+	// TransactionCmd.PersistentFlags().BoolVarP(&clientDo.SignFlag, "sign", "s", false, "sign the transaction using the eris-keys daemon")
+	TransactionCmd.PersistentFlags().BoolVarP(&clientDo.BroadcastFlag, "broadcast", "b", false, "broadcast the transaction to the blockchain")
+	TransactionCmd.PersistentFlags().BoolVarP(&clientDo.WaitFlag, "wait", "w", false, "wait for the transaction to be committed in a block")
 }
 
 //------------------------------------------------------------------------------
@@ -159,3 +189,13 @@ func defaultPublicKey() string {
 func defaultAddress() string {
 	return setDefaultString("ERIS_CLIENT_ADDRESS", "")
 }
+
+//------------------------------------------------------------------------------
+// Helper functions
+
+func assertChainIdSet(cmd *cobra.Command, args []string) {
+	if clientDo.ChainidFlag == "" {
+		log.Fatalf(`Cannot run "eris-client tx" without chain id set in --chain-id or $CHAIN_ID.`)
+		os.Exit(1)
+	}
+}
\ No newline at end of file
diff --git a/client/transaction/transaction.go b/client/transaction/transaction.go
index 8ac3150c..17394144 100644
--- a/client/transaction/transaction.go
+++ b/client/transaction/transaction.go
@@ -17,19 +17,19 @@
 package transaction
 
 import (
-	"fmt"
-	"io/ioutil"
+	// "fmt"
+	// "io/ioutil"
 
-	"github.com/eris-ltd/eris-logger"
+	// "github.com/eris-ltd/eris-logger"
 
-	"github.com/eris-ltd/eris-db/client/core"
+	// // "github.com/eris-ltd/eris-db/client/core"
 	"github.com/eris-ltd/eris-db/definitions"
 )
 
-func transactionSend(do *definitions.ClientDo) {
-	transaction, err := core.Send(do.nodeAddrFlag, do.signAddrFlag,
-		do.pubkeyFlag, do.toFlag, do.amtFlag, do.nonceFlag)
-	if err != nil {
-		log.Fatalf("Failed on Send Transaction: %s", err)
-	}
+func Send(do *definitions.ClientDo) {
+	// transaction, err := core.Send(do.nodeAddrFlag, do.signAddrFlag,
+	// 	do.pubkeyFlag, do.toFlag, do.amtFlag, do.nonceFlag)
+	// if err != nil {
+	// 	log.Fatalf("Failed on Send Transaction: %s", err)
+	// }
 }
\ No newline at end of file
diff --git a/definitions/client_do.go b/definitions/client_do.go
index 0b3dc562..1c103d9a 100644
--- a/definitions/client_do.go
+++ b/definitions/client_do.go
@@ -16,36 +16,36 @@
 
 package definitions
 
-type ClientDo {
+type ClientDo struct {
 	// Persistent flags not reflected in the configuration files
 	// only set through command line flags or environment variables
 	Debug   bool // ERIS_DB_DEBUG
 	Verbose bool // ERIS_DB_VERBOSE
 
-	// Following parameters are global flags for eris-client
-	signAddrFlag string
-	nodeAddrFlag string
-	pubkeyFlag   string
-	addrFlag     string
-	chainidFlag  string
+	// Following parameters are global flags for eris-client tx
+	SignAddrFlag string
+	NodeAddrFlag string
+	PubkeyFlag   string
+	AddrFlag     string
+	ChainidFlag  string
 
 	// signFlag      bool // TODO: remove; unsafe signing without eris-keys
-	broadcastFlag bool
-	waitFlag      bool
+	BroadcastFlag bool
+	WaitFlag      bool
 
-	// Following parameters are specific for Transaction command
+	// Following parameters are vary for different Transaction subcommands
 	// some of these are strings rather than flags because the `core`
 	// functions have a pure string interface so they work nicely from http
-	amtFlag      string
-	nonceFlag    string
-	nameFlag     string
-	dataFlag     string
-	dataFileFlag string
-	toFlag       string
-	feeFlag      string
-	gasFlag      string
-	unbondtoFlag string
-	heightFlag   string
+	AmtFlag      string
+	NonceFlag    string
+	NameFlag     string
+	DataFlag     string
+	DataFileFlag string
+	ToFlag       string
+	FeeFlag      string
+	GasFlag      string
+	UnbondtoFlag string
+	HeightFlag   string
 }
 
 func NewClientDo() *ClientDo {
@@ -53,26 +53,26 @@ func NewClientDo() *ClientDo {
 	clientDo.Debug = false
 	clientDo.Verbose = false
 	
-	clientDo.signAddrFlag = ""
-	clientDo.nodeAddrFlag = ""
-	clientDo.pubkeyFlag = ""
-	clientDo.addrFlag = ""
-	clientDo.chainidFlag = ""
+	clientDo.SignAddrFlag = ""
+	clientDo.NodeAddrFlag = ""
+	clientDo.PubkeyFlag = ""
+	clientDo.AddrFlag = ""
+	clientDo.ChainidFlag = ""
 
-	clientDo.signFlag = false
-	clientDo.broadcastFlag = false
-	clientDo.waitFlag = false
+	// clientDo.signFlag = false
+	clientDo.BroadcastFlag = false
+	clientDo.WaitFlag = false
 
-	clientDo.amtFlag = ""
-	clientDo.nonceFlag = ""
-	clientDo.nameFlag = ""
-	clientDo.dataFlag = ""
-	clientDo.dataFileFlag = ""
-	clientDo.toFlag = ""
-	clientDo.feeFlag = ""
-	clientDo.gasFlag = ""
-	clientDo.unbondtoFlag = ""
-	clientDo.heightFlag = ""
+	clientDo.AmtFlag = ""
+	clientDo.NonceFlag = ""
+	clientDo.NameFlag = ""
+	clientDo.DataFlag = ""
+	clientDo.DataFileFlag = ""
+	clientDo.ToFlag = ""
+	clientDo.FeeFlag = ""
+	clientDo.GasFlag = ""
+	clientDo.UnbondtoFlag = ""
+	clientDo.HeightFlag = ""
 
 	return clientDo
 }
\ No newline at end of file
-- 
GitLab