value.go raw

   1  package ini
   2  
   3  import (
   4  	"fmt"
   5  	"strconv"
   6  	"strings"
   7  )
   8  
   9  // ValueType is an enum that will signify what type
  10  // the Value is
  11  type ValueType int
  12  
  13  func (v ValueType) String() string {
  14  	switch v {
  15  	case NoneType:
  16  		return "NONE"
  17  	case StringType:
  18  		return "STRING"
  19  	}
  20  
  21  	return ""
  22  }
  23  
  24  // ValueType enums
  25  const (
  26  	NoneType = ValueType(iota)
  27  	StringType
  28  	QuotedStringType
  29  )
  30  
  31  // Value is a union container
  32  type Value struct {
  33  	Type ValueType
  34  
  35  	str string
  36  	mp  map[string]string
  37  }
  38  
  39  // NewStringValue returns a Value type generated using a string input.
  40  func NewStringValue(str string) (Value, error) {
  41  	return Value{str: str}, nil
  42  }
  43  
  44  func (v Value) String() string {
  45  	switch v.Type {
  46  	case StringType:
  47  		return fmt.Sprintf("string: %s", string(v.str))
  48  	case QuotedStringType:
  49  		return fmt.Sprintf("quoted string: %s", string(v.str))
  50  	default:
  51  		return "union not set"
  52  	}
  53  }
  54  
  55  // MapValue returns a map value for sub properties
  56  func (v Value) MapValue() map[string]string {
  57  	return v.mp
  58  }
  59  
  60  // IntValue returns an integer value
  61  func (v Value) IntValue() (int64, bool) {
  62  	i, err := strconv.ParseInt(string(v.str), 0, 64)
  63  	if err != nil {
  64  		return 0, false
  65  	}
  66  	return i, true
  67  }
  68  
  69  // FloatValue returns a float value
  70  func (v Value) FloatValue() (float64, bool) {
  71  	f, err := strconv.ParseFloat(string(v.str), 64)
  72  	if err != nil {
  73  		return 0, false
  74  	}
  75  	return f, true
  76  }
  77  
  78  // BoolValue returns a bool value
  79  func (v Value) BoolValue() (bool, bool) {
  80  	// we don't use ParseBool as it recognizes more than what we've
  81  	// historically supported
  82  	if strings.EqualFold(v.str, "true") {
  83  		return true, true
  84  	} else if strings.EqualFold(v.str, "false") {
  85  		return false, true
  86  	}
  87  	return false, false
  88  }
  89  
  90  // StringValue returns the string value
  91  func (v Value) StringValue() string {
  92  	return v.str
  93  }
  94