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, error) { section, err := config.file.GetSection(sectionName) if err != nil { return nil, err } return section, nil } 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 CreateSection(path string, file *ini.File) error { pathSplit := strings.Split(path, ".") for i := 0; i < len(pathSplit)-1; i++ { file.NewSections() } return nil } func (config *Configuration) GetKey(path string) (*ini.Key, error) { splitPaths := strings.Split(path, ".") if len(splitPaths) == 1 { splitPaths = append([]string{"."}, splitPaths...) } sectionMask := strings.Join(splitPaths[0:len(splitPaths)-1], ".") section, err := config.GetSection(sectionMask) if err != nil { return nil, err } keyName := splitPaths[len(splitPaths)-1] key, err := section.GetKey(keyName) if err != nil { return nil, err } return key, nil } func (config *Configuration) SetValue(path string, value string) { key, err := config.GetKey(path) if err != nil { err = nil splitPath := strings.Split(path, ".") err = config.file.NewSections(splitPath[0 : len(splitPath)-1]...) if err != nil { fmt.Printf("Error creating section %v in config: %v", path, err) os.Exit(1) } fmt.Printf("New Val: Split Path: %v", splitPath) } key, err = config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) os.Exit(1) } key.SetValue(value) } func (config *Configuration) GetAsString(path string) string { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.String() } func (config *Configuration) GetAsStrings(path string) []string { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.Strings(",") } func (config *Configuration) GetAsInt(path string) int { var i int var err error key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } i, err = key.Int() if err != nil { fmt.Printf("Error parsing integer: %v", err) os.Exit(1) } return i } func (config *Configuration) GetAsInts(path string) []int { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.Ints(",") } func (config *Configuration) GetAsUInt(path string) uint { var i uint var err error key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } i, err = key.Uint() if err != nil { fmt.Printf("Error parsing integer: %v", err) os.Exit(1) } return i } func (config *Configuration) GetAsUInts(path string) []uint { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.Uints(",") } func (config *Configuration) GetAsFloat(path string) float64 { var f float64 var err error key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } f, err = key.Float64() if err != nil { fmt.Printf("Error parsing float: %v", err) os.Exit(1) } return f } func (config *Configuration) GetAsFloats(path string) []float64 { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.Float64s(",") } func (config *Configuration) GetAsBoolean(path string) bool { var b bool var err error key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } b, err = key.Bool() if err != nil { fmt.Printf("Error parsingn bool: %v", err) os.Exit(1) } return b } func (config *Configuration) GetAsBooleans(path string) []bool { key, err := config.GetKey(path) if err != nil { fmt.Printf("Error getting path %v in config: %v", path, err) } return key.Bools(",") } func (config *Configuration) IsSet(path string) bool { key, err := config.GetKey(path) if err != nil { return false } return key.Value() != "" } func (config *Configuration) load() { if _, err := os.Stat(config.fileLocation); err != nil { file, err := os.Create(config.fileLocation) if err != nil { fmt.Printf("Failed to create configuration file: %v", err) os.Exit(1) } _, err = file.WriteString("") if err != nil { fmt.Printf("Error creating configuration file: %v", err) os.Exit(1) } } var err error 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) Save() { err := config.file.SaveTo(config.fileLocation) if err != nil { fmt.Printf("Failed to save configuration file: %v", err) os.Exit(1) } }