waku-org/go-waku

View on GitHub
waku/cliutils/cli.go

Summary

Maintainability
A
0 mins
Test Coverage
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)
}