Files
ezconf/ini.go

295 lines
6.7 KiB
Go

package ezconf
import (
"errors"
"fmt"
"os"
"strings"
"gopkg.in/ini.v1"
)
type Configuration struct {
fileLocation string
file *ini.File
}
func CreateConfigurationFile(fileLocation string, defaultConfig string) error {
err := createFile(fileLocation, []byte(defaultConfig))
if err != nil {
return err
}
return nil
}
func NewConfiguration(fileLocation string, defaultConfig string) (*Configuration, error) {
conf := new(Configuration)
conf.fileLocation = fileLocation
err := conf.createAndLoad(defaultConfig)
if err != nil {
return nil, err
}
return conf, nil
}
func LoadConfiguration(fileLocation string) (*Configuration, error) {
conf := new(Configuration)
conf.fileLocation = fileLocation
err := conf.load()
if err != nil {
return nil, err
}
return conf, nil
}
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++ {
err := file.NewSections()
if err != nil {
return err
}
}
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\n", path, err)
os.Exit(1)
}
fmt.Printf("New Val: Split Path: %v\n", splitPath)
}
key, err = config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
os.Exit(1)
}
key.SetValue(value)
}
func (config *Configuration) GetAsString(path string) (string, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return "", nil
}
return key.String(), nil
}
func (config *Configuration) GetAsStrings(path string) ([]string, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return nil, err
}
return key.Strings(","), nil
}
func (config *Configuration) GetAsInt(path string) (int, error) {
var i int
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return 0, err
}
i, err = key.Int()
if err != nil {
fmt.Printf("Error parsing integer: %v\n", err)
return 0, err
}
return i, nil
}
func (config *Configuration) GetAsInts(path string) ([]int, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return nil, err
}
return key.Ints(","), nil
}
func (config *Configuration) GetAsUInt(path string) (uint, error) {
var i uint
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return 0, err
}
i, err = key.Uint()
if err != nil {
fmt.Printf("Error parsing integer: %v\n", err)
return 0, err
}
return i, nil
}
func (config *Configuration) GetAsUInts(path string) ([]uint, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return nil, err
}
return key.Uints(","), nil
}
func (config *Configuration) GetAsFloat(path string) (float64, error) {
var f float64
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return 0, err
}
f, err = key.Float64()
if err != nil {
fmt.Printf("Error parsing float: %v\n", err)
return 0, err
}
return f, nil
}
func (config *Configuration) GetAsFloats(path string) ([]float64, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return nil, err
}
return key.Float64s(","), nil
}
func (config *Configuration) GetAsBoolean(path string) (bool, error) {
var b bool
var err error
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return false, err
}
b, err = key.Bool()
if err != nil {
fmt.Printf("Error parsing bool: %v\n", err)
return false, err
}
return b, nil
}
func (config *Configuration) GetAsBooleans(path string) ([]bool, error) {
key, err := config.GetKey(path)
if err != nil {
fmt.Printf("Error getting path %v in config: %v\n", path, err)
return nil, err
}
return key.Bools(","), nil
}
func (config *Configuration) IsSet(path string) bool {
key, err := config.GetKey(path)
if err != nil {
return false
}
return key.Value() != ""
}
func (config *Configuration) createAndLoad(defaultConfig string) error {
err := createFile(config.fileLocation, []byte(defaultConfig))
if err != nil {
return err
}
err = config.load()
if err != nil {
return err
}
return nil
}
func (config *Configuration) load() error {
var err error
config.file, err = ini.Load(config.fileLocation)
if err != nil {
fmt.Printf("Failed to open configuration file: %v\n", err)
return err
}
return nil
}
func (config *Configuration) Save() error {
err := config.file.SaveTo(config.fileLocation)
if err != nil {
fmt.Printf("Failed to save configuration file: %v\n", err)
return err
}
return nil
}
func createFile(fileLocation string, data []byte) error {
_, err := os.Stat(fileLocation)
if errors.Is(err, os.ErrNotExist) {
file, err := os.Create(fileLocation)
if err != nil {
fmt.Printf("Failed to create file: %v", err)
return err
}
defer file.Close()
_, err = file.Write(data)
if err != nil {
fmt.Printf("Error writing to file: %v", err)
return err
}
return nil
} else if err != nil {
fmt.Printf("Error creating file: %v", err)
return err
}
fmt.Printf("File already exists...")
return nil
}