aboutsummaryrefslogtreecommitdiffstats
path: root/formats/config/common.go
diff options
context:
space:
mode:
Diffstat (limited to 'formats/config/common.go')
-rw-r--r--formats/config/common.go96
1 files changed, 96 insertions, 0 deletions
diff --git a/formats/config/common.go b/formats/config/common.go
new file mode 100644
index 0000000..e7292e9
--- /dev/null
+++ b/formats/config/common.go
@@ -0,0 +1,96 @@
+package config
+
+// New creates a new config instance.
+func New() *Config {
+ return &Config{}
+}
+
+type Config struct {
+ Comment *Comment
+ Sections Sections
+ Includes Includes
+}
+
+type Includes []*Include
+
+// A reference to a included configuration.
+type Include struct {
+ Path string
+ Config *Config
+}
+
+type Comment string
+
+const (
+ NoSubsection = ""
+)
+
+func (c *Config) Section(name string) *Section {
+ for i := len(c.Sections) - 1; i >= 0; i-- {
+ s := c.Sections[i]
+ if s.IsName(name) {
+ return s
+ }
+ }
+ s := &Section{Name: name}
+ c.Sections = append(c.Sections, s)
+ return s
+}
+
+// AddOption is a convenience method to add an option to a given
+// section and subsection.
+//
+// Use the NoSubsection constant for the subsection argument
+// if no subsection is wanted.
+func (s *Config) AddOption(section string, subsection string, key string, value string) *Config {
+ if subsection == "" {
+ s.Section(section).AddOption(key, value)
+ } else {
+ s.Section(section).Subsection(subsection).AddOption(key, value)
+ }
+
+ return s
+}
+
+// SetOption is a convenience method to set an option to a given
+// section and subsection.
+//
+// Use the NoSubsection constant for the subsection argument
+// if no subsection is wanted.
+func (s *Config) SetOption(section string, subsection string, key string, value string) *Config {
+ if subsection == "" {
+ s.Section(section).SetOption(key, value)
+ } else {
+ s.Section(section).Subsection(subsection).SetOption(key, value)
+ }
+
+ return s
+}
+
+func (c *Config) RemoveSection(name string) *Config {
+ result := Sections{}
+ for _, s := range c.Sections {
+ if !s.IsName(name) {
+ result = append(result, s)
+ }
+ }
+
+ c.Sections = result
+ return c
+}
+
+func (c *Config) RemoveSubsection(section string, subsection string) *Config {
+ for _, s := range c.Sections {
+ if s.IsName(section) {
+ result := Subsections{}
+ for _, ss := range s.Subsections {
+ if !ss.IsName(subsection) {
+ result = append(result, ss)
+ }
+ }
+ s.Subsections = result
+ }
+ }
+
+ return c
+}