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