amount.go raw

   1  package cfgutil
   2  
   3  import (
   4  	"github.com/p9c/p9/pkg/amt"
   5  	"strconv"
   6  	"strings"
   7  )
   8  
   9  // AmountFlag embeds a util.Amount and implements the flags.Marshaler and Unmarshaler interfaces so it can be used as a
  10  // config struct field.
  11  type AmountFlag struct {
  12  	amt.Amount
  13  }
  14  
  15  // NewAmountFlag creates an AmountFlag with a default util.Amount.
  16  func NewAmountFlag(defaultValue amt.Amount) *AmountFlag {
  17  	return &AmountFlag{defaultValue}
  18  }
  19  
  20  // MarshalFlag satisifes the flags.Marshaler interface.
  21  func (a *AmountFlag) MarshalFlag() (string, error) {
  22  	return a.Amount.String(), nil
  23  }
  24  
  25  // UnmarshalFlag satisifes the flags.Unmarshaler interface.
  26  func (a *AmountFlag) UnmarshalFlag(value string) (e error) {
  27  	value = strings.TrimSuffix(value, " DUO")
  28  	valueF64, e := strconv.ParseFloat(value, 64)
  29  	if e != nil {
  30  		E.Ln(e)
  31  		return e
  32  	}
  33  	amount, e := amt.NewAmount(valueF64)
  34  	if e != nil {
  35  		E.Ln(e)
  36  		return e
  37  	}
  38  	a.Amount = amount
  39  	return nil
  40  }
  41