package ezconf import ( "errors" "fmt" "gopkg.in/ini.v1" "os" "strings" ) type Configuration struct { fileLocation string file *ini.File } func NewConfiguration(fileLocation string) *Configuration { conf := new(Configuration) conf.fileLocation = fileLocation conf.load() return conf } func (config *Configuration) GetSection(sectionName string) *ini.Section { section, err := config.file.GetSection(sectionName) if err != nil { fmt.Printf("Error getting section %v in config: %v", sectionName, err) os.Exit(1) } return section } func GetChildSection(section *ini.Section, childSectionName string) (childSection *ini.Section, err error) { childSections := section.ChildSections() for _, childSection = range childSections { if childSection.Name() == childSectionName { return } } return nil, errors.New("subsection " + childSectionName + " not found") } func GetChildSections(section *ini.Section) (childSections []*ini.Section) { return section.ChildSections() } func (config *Configuration) GetKey(path string) *ini.Key { splitPaths := strings.Split(path, ".") if len(splitPaths) == 1 { splitPaths = append([]string{"."}, splitPaths...) } sectionMask := strings.Join(splitPaths[0:len(splitPaths)-1], ".") section := config.GetSection(sectionMask) keyName := splitPaths[len(splitPaths)-1] key, err := section.GetKey(keyName) if err != nil { fmt.Printf("Error getting key %v: %v", keyName, err) } return key } func (config *Configuration) GetAsString(path string) string { return config.GetKey(path).String() } func (config *Configuration) SetValue(path string, value string) { config.GetKey(path).SetValue(value) } func (config *Configuration) GetAsStrings(path string) []string { return config.GetKey(path).Strings(",") } func (config *Configuration) GetAsInt(path string) int { var i int var err error i, err = config.GetKey(path).Int() if err != nil { fmt.Printf("Error parsing integer: %v", err) os.Exit(1) } return i } func (config *Configuration) GetAsInts(path string) []int { return config.GetKey(path).Ints(",") } func (config *Configuration) GetAsUInt(path string) uint { var i uint var err error i, err = config.GetKey(path).Uint() if err != nil { fmt.Printf("Error parsing integer: %v", err) os.Exit(1) } return i } func (config *Configuration) GetAsUInts(path string) []uint { return config.GetKey(path).Uints(",") } func (config *Configuration) GetAsFloat(path string) float64 { var f float64 var err error f, err = config.GetKey(path).Float64() if err != nil { fmt.Printf("Error parsing float: %v", err) os.Exit(1) } return f } func (config *Configuration) GetAsFloats(path string) []float64 { return config.GetKey(path).Float64s(",") } func (config *Configuration) GetAsBoolean(path string) bool { var b bool var err error b, err = config.GetKey(path).Bool() if err != nil { fmt.Printf("Error parsingn bool: %v", err) os.Exit(1) } return b } func (config *Configuration) GetAsBooleans(path string) []bool { return config.GetKey(path).Bools(",") } func (config *Configuration) load() { var err error = nil config.file, err = ini.Load(config.fileLocation) if err != nil { fmt.Printf("Failed to open configuration file: %v", err) os.Exit(1) } } func (config *Configuration) Reload() { config.load() } func (config *Configuration) Save() { err := config.file.SaveTo(config.fileLocation) if err != nil { fmt.Printf("Failed to save configuration file: %v", err) os.Exit(1) } }