value.go (1765B)
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 }