waku/cliutils/cli.go
package cliutils
import (
"crypto/ecdsa"
"errors"
"fmt"
"strconv"
"strings"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
)
type AddressValue struct {
Value *common.Address
}
func (v *AddressValue) Set(value string) error {
if !common.IsHexAddress(value) {
return errors.New("invalid ethereum address")
}
*v.Value = common.HexToAddress(value)
return nil
}
func (v *AddressValue) String() string {
if v.Value == nil {
return ""
}
return (*v.Value).Hex()
}
type PrivateKeyValue struct {
Value **ecdsa.PrivateKey
}
func (v *PrivateKeyValue) Set(value string) error {
prvKey, err := crypto.ToECDSA(common.FromHex(value))
if err != nil {
return errors.New("invalid private key")
}
*v.Value = prvKey
return nil
}
func (v *PrivateKeyValue) String() string {
if v.Value == nil || *v.Value == nil {
return ""
}
return "0x" + common.Bytes2Hex(crypto.FromECDSA(*v.Value))
}
type ChoiceValue struct {
Choices []string // the choices that this value can take
Value *string // the actual value
}
func (v *ChoiceValue) Set(value string) error {
for _, choice := range v.Choices {
if strings.Compare(choice, value) == 0 {
*v.Value = value
return nil
}
}
return fmt.Errorf("%s is not a valid option. need %+v", value, v.Choices)
}
func (v *ChoiceValue) String() string {
if v.Value == nil {
return ""
}
return *v.Value
}
// OptionalUint represents a urfave/cli flag to store uint values that can be
// optionally set and not have any default value assigned to it
type OptionalUint struct {
Value **uint
}
// Set assigns a value to the flag only if it represents a valid uint value
func (v *OptionalUint) Set(value string) error {
if value != "" {
uintVal, err := strconv.ParseUint(value, 10, 0)
if err != nil {
return err
}
uVal := uint(uintVal)
*v.Value = &uVal
} else {
v.Value = nil
}
return nil
}
// String returns the string representation of the OptionalUint flag, if set
func (v *OptionalUint) String() string {
if v.Value == nil {
return ""
}
return fmt.Sprintf("%d", *v.Value)
}