1package ini
2
3import (
4 "sort"
5)
6
7// Sections is a map of Section structures that represent
8// a configuration.
9type Sections struct {
10 container map[string]Section
11}
12
13// NewSections returns empty ini Sections
14func NewSections() Sections {
15 return Sections{
16 container: make(map[string]Section, 0),
17 }
18}
19
20// GetSection will return section p. If section p does not exist,
21// false will be returned in the second parameter.
22func (t Sections) GetSection(p string) (Section, bool) {
23 v, ok := t.container[p]
24 return v, ok
25}
26
27// HasSection denotes if Sections consist of a section with
28// provided name.
29func (t Sections) HasSection(p string) bool {
30 _, ok := t.container[p]
31 return ok
32}
33
34// SetSection sets a section value for provided section name.
35func (t Sections) SetSection(p string, v Section) Sections {
36 t.container[p] = v
37 return t
38}
39
40// DeleteSection deletes a section entry/value for provided section name./
41func (t Sections) DeleteSection(p string) {
42 delete(t.container, p)
43}
44
45// values represents a map of union values.
46type values map[string]Value
47
48// List will return a list of all sections that were successfully
49// parsed.
50func (t Sections) List() []string {
51 keys := make([]string, len(t.container))
52 i := 0
53 for k := range t.container {
54 keys[i] = k
55 i++
56 }
57
58 sort.Strings(keys)
59 return keys
60}
61
62// Section contains a name and values. This represent
63// a sectioned entry in a configuration file.
64type Section struct {
65 // Name is the Section profile name
66 Name string
67
68 // values are the values within parsed profile
69 values values
70
71 // Errors is the list of errors
72 Errors []error
73
74 // Logs is the list of logs
75 Logs []string
76
77 // SourceFile is the INI Source file from where this section
78 // was retrieved. They key is the property, value is the
79 // source file the property was retrieved from.
80 SourceFile map[string]string
81}
82
83// NewSection returns an initialize section for the name
84func NewSection(name string) Section {
85 return Section{
86 Name: name,
87 values: values{},
88 SourceFile: map[string]string{},
89 }
90}
91
92// List will return a list of all
93// services in values
94func (t Section) List() []string {
95 keys := make([]string, len(t.values))
96 i := 0
97 for k := range t.values {
98 keys[i] = k
99 i++
100 }
101
102 sort.Strings(keys)
103 return keys
104}
105
106// UpdateSourceFile updates source file for a property to provided filepath.
107func (t Section) UpdateSourceFile(property string, filepath string) {
108 t.SourceFile[property] = filepath
109}
110
111// UpdateValue updates value for a provided key with provided value
112func (t Section) UpdateValue(k string, v Value) error {
113 t.values[k] = v
114 return nil
115}
116
117// Has will return whether or not an entry exists in a given section
118func (t Section) Has(k string) bool {
119 _, ok := t.values[k]
120 return ok
121}
122
123// ValueType will returned what type the union is set to. If
124// k was not found, the NoneType will be returned.
125func (t Section) ValueType(k string) (ValueType, bool) {
126 v, ok := t.values[k]
127 return v.Type, ok
128}
129
130// Bool returns a bool value at k
131func (t Section) Bool(k string) (bool, bool) {
132 return t.values[k].BoolValue()
133}
134
135// Int returns an integer value at k
136func (t Section) Int(k string) (int64, bool) {
137 return t.values[k].IntValue()
138}
139
140// Map returns a map value at k
141func (t Section) Map(k string) map[string]string {
142 return t.values[k].MapValue()
143}
144
145// Float64 returns a float value at k
146func (t Section) Float64(k string) (float64, bool) {
147 return t.values[k].FloatValue()
148}
149
150// String returns the string value at k
151func (t Section) String(k string) string {
152 _, ok := t.values[k]
153 if !ok {
154 return ""
155 }
156 return t.values[k].StringValue()
157}