Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions cmd/common/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ var (

// VerboseFlag specifies the command's verbosity.
VerboseFlag *flag.FlagSet

// DenominationFlags holds flags for --description, --symbol, and --num-decimals.
DenominationFlags *flag.FlagSet
)

// FormatType specifies the type of format for output of commands.
Expand Down Expand Up @@ -65,6 +68,10 @@ var (
answerYes bool
outputFormat = FormatText
verbose bool

denominationDescription string
denominationSymbol string
denominationNumDecimals uint
)

// GetHeight returns the user-selected block height.
Expand Down Expand Up @@ -125,4 +132,9 @@ func init() {

VerboseFlag = flag.NewFlagSet("", flag.ContinueOnError)
VerboseFlag.BoolVarP(&verbose, "verbose", "v", false, "verbose")

DenominationFlags = flag.NewFlagSet("", flag.ContinueOnError)
DenominationFlags.StringVar(&denominationDescription, "description", "", "description")
DenominationFlags.StringVar(&denominationSymbol, "symbol", "", "symbol")
DenominationFlags.UintVar(&denominationNumDecimals, "num-decimals", 0, "number of decimals")
}
55 changes: 55 additions & 0 deletions cmd/common/prompts.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,61 @@ func Confirm(msg, abortMsg string) {
}
}

// DenominationDetails holds the editable description/symbol/decimal-places fields used by the
// network add, add-local, and paratime add commands.
type DenominationDetails struct {
Description string
Symbol string
Decimals uint8
}

// AskDenominationDetails prompts for description, symbol and num-decimals unless -y given.
func AskDenominationDetails(d *DenominationDetails) {
if denominationDescription != "" {
d.Description = denominationDescription
}
if denominationSymbol != "" {
d.Symbol = denominationSymbol
}
if denominationNumDecimals != 0 {
d.Decimals = uint8(denominationNumDecimals) //nolint: gosec
}

if GetAnswerYes() {
return
}

questions := []*survey.Question{
{
Name: "description",
Prompt: &survey.Input{Message: "Description:", Default: d.Description},
},
{
Name: "symbol",
Prompt: &survey.Input{Message: "Denomination symbol:", Default: d.Symbol},
},
{
Name: "decimals",
Prompt: &survey.Input{
Message: "Denomination decimal places:",
Default: fmt.Sprintf("%d", d.Decimals),
},
Validate: survey.Required,
},
}
answers := struct {
Description string
Symbol string
Decimals uint8
}{}
err := AskMulti(questions, &answers)
cobra.CheckErr(err)

d.Description = answers.Description
d.Symbol = answers.Symbol
d.Decimals = answers.Decimals
}

// AskNewPassphrase asks the user to create a new passphrase.
func AskNewPassphrase() string {
var answers struct {
Expand Down
8 changes: 7 additions & 1 deletion cmd/network/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/oasisprotocol/oasis-sdk/client-sdk/go/config"
"github.com/oasisprotocol/oasis-sdk/client-sdk/go/connection"

"github.com/oasisprotocol/cli/cmd/common"
cliConfig "github.com/oasisprotocol/cli/config"
)

Expand Down Expand Up @@ -61,7 +62,7 @@ var addCmd = &cobra.Command{

cobra.CheckErr(net.Validate())

// Ask user for some additional parameters.
// Let the user change detected parameters, if needed.
networkDetailsFromSurvey(&net)

err := cfg.Networks.Add(name, &net)
Expand All @@ -71,3 +72,8 @@ var addCmd = &cobra.Command{
cobra.CheckErr(err)
},
}

func init() {
addCmd.Flags().AddFlagSet(common.AnswerYesFlag)
addCmd.Flags().AddFlagSet(common.DenominationFlags)
}
85 changes: 23 additions & 62 deletions cmd/network/add_local.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
"strings"

"github.com/spf13/cobra"
flag "github.com/spf13/pflag"

cmnGrpc "github.com/oasisprotocol/oasis-core/go/common/grpc"
"github.com/oasisprotocol/oasis-sdk/client-sdk/go/config"
Expand All @@ -18,34 +17,28 @@ import (
cliConfig "github.com/oasisprotocol/cli/config"
)

var (
symbol string
numDecimals uint
description string

addLocalCmd = &cobra.Command{
Use: "add-local <name> <rpc-endpoint>",
Short: "Add a new local network",
Args: cobra.ExactArgs(2),
Run: func(_ *cobra.Command, args []string) {
name, rpc := args[0], args[1]

// Validate initial network configuration early.
cobra.CheckErr(config.ValidateIdentifier(name))

// Check if a local file name was given without protocol.
if !strings.HasPrefix(rpc, "unix:") {
if info, err := os.Stat(rpc); err == nil {
if !info.IsDir() {
rpc = "unix:" + rpc
}
var addLocalCmd = &cobra.Command{
Use: "add-local <name> <rpc-endpoint>",
Short: "Add a new local network",
Args: cobra.ExactArgs(2),
Run: func(_ *cobra.Command, args []string) {
name, rpc := args[0], args[1]

// Validate initial network configuration early.
cobra.CheckErr(config.ValidateIdentifier(name))

// Check if a local file name was given without protocol.
if !strings.HasPrefix(rpc, "unix:") {
if info, err := os.Stat(rpc); err == nil {
if !info.IsDir() {
rpc = "unix:" + rpc
}
}
}

AddLocalNetwork(name, rpc)
},
}
)
AddLocalNetwork(name, rpc)
},
}

func AddLocalNetwork(name string, rpc string) {
cfg := cliConfig.Global()
Expand Down Expand Up @@ -75,40 +68,19 @@ func AddLocalNetwork(name string, rpc string) {
net.ChainContext = chainContext
cobra.CheckErr(net.Validate())

// With a very high probability, the user is going to be
// adding a local endpoint for an existing network, so try
// to clone config details from any of the hardcoded
// defaults.
var clonedDefault bool
// Try to clone config details from any of the hardcoded defaults.
for _, defaultNet := range config.DefaultNetworks.All {
if defaultNet.ChainContext != chainContext {
continue
}

// Yep.
net.Denomination = defaultNet.Denomination
net.ParaTimes = defaultNet.ParaTimes
clonedDefault = true
break
}

if symbol != "" {
net.Denomination.Symbol = symbol
}

if numDecimals != 0 {
net.Denomination.Decimals = uint8(numDecimals) //nolint: gosec
}

if description != "" {
net.Description = description
}

// If we failed to crib details from a hardcoded config,
// and user did not set -y flag ask the user.
if !clonedDefault && !common.GetAnswerYes() {
networkDetailsFromSurvey(&net)
}
// Let the user change detected parameters, if needed.
networkDetailsFromSurvey(&net)

err = cfg.Networks.Add(name, &net)
cobra.CheckErr(err)
Expand Down Expand Up @@ -149,16 +121,5 @@ func extractAbsPath(rpc string) (string, error) {

func init() {
addLocalCmd.Flags().AddFlagSet(common.AnswerYesFlag)

symbolFlag := flag.NewFlagSet("", flag.ContinueOnError)
symbolFlag.StringVar(&symbol, "symbol", "", "network's symbol")
addLocalCmd.Flags().AddFlagSet(symbolFlag)

numDecimalsFlag := flag.NewFlagSet("", flag.ContinueOnError)
numDecimalsFlag.UintVar(&numDecimals, "num-decimals", 0, "network's number of decimals")
addLocalCmd.Flags().AddFlagSet(numDecimalsFlag)

descriptionFlag := flag.NewFlagSet("", flag.ContinueOnError)
descriptionFlag.StringVar(&description, "description", "", "network's description")
addLocalCmd.Flags().AddFlagSet(descriptionFlag)
addLocalCmd.Flags().AddFlagSet(common.DenominationFlags)
}
43 changes: 14 additions & 29 deletions cmd/network/network.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package network

import (
"github.com/AlecAivazis/survey/v2"
"github.com/spf13/cobra"

"github.com/oasisprotocol/oasis-sdk/client-sdk/go/config"
Expand All @@ -18,36 +17,22 @@ var Cmd = &cobra.Command{
}

func networkDetailsFromSurvey(net *config.Network) {
// Ask user for some additional parameters.
questions := []*survey.Question{
{
Name: "description",
Prompt: &survey.Input{Message: "Description:"},
},
{
Name: "symbol",
Prompt: &survey.Input{Message: "Denomination symbol:"},
},
{
Name: "decimals",
Prompt: &survey.Input{
Message: "Denomination decimal places:",
Default: "9",
},
Validate: survey.Required,
},
// 9 is the default used for new networks when nothing better (an existing value cloned from a
// hardcoded default network, or a --num-decimals flag) is available.
decimals := net.Denomination.Decimals
if decimals == 0 {
decimals = 9
}
answers := struct {
Description string
Symbol string
Decimals uint8
}{}
err := common.AskMulti(questions, &answers)
cobra.CheckErr(err)
details := common.DenominationDetails{
Description: net.Description,
Symbol: net.Denomination.Symbol,
Decimals: decimals,
}
common.AskDenominationDetails(&details)

net.Description = answers.Description
net.Denomination.Symbol = answers.Symbol
net.Denomination.Decimals = answers.Decimals
net.Description = details.Description
net.Denomination.Symbol = details.Symbol
net.Denomination.Decimals = details.Decimals
}

func init() {
Expand Down
Loading
Loading