>> github:
https://github.com/widuu/goini
conf.go
/**//**
* Read the configuration file
*
* @copyright (C) 2014 widuu
* @lastmodify 2014-2-22
* @website http://www.widuu.com
*
*/
package goini
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
type Config struct {
filepath string //your ini file path directory+file
conflist []map[string]map[string]string //configuration information slice
}
//Create an empty configuration file
func SetConfig(filepath string) *Config {
c := new(Config)
c.filepath = filepath
return c
}
//To obtain corresponding value of the key values
func (c *Config) GetValue(section, name string) string {
c.ReadList()
conf := c.ReadList()
for _, v := range conf {
for key, value := range v {
if key == section {
return value[name]
}
}
}
return "no value"
}
//Set the corresponding value of the key value, if not add, if there is a key change
func (c *Config) SetValue(section, key, value string) bool {
c.ReadList()
data := c.conflist
var ok bool
var index = make(map[int]bool)
var conf = make(map[string]map[string]string)
for i, v := range data {
_, ok = v[section]
index[i] = ok
}
i, ok := func(m map[int]bool) (i int, v bool) {
for i, v := range m {
if v == true {
return i, true
}
}
return 0, false
}(index)
if ok {
c.conflist[i][section][key] = value
return true
} else {
conf[section] = make(map[string]string)
conf[section][key] = value
c.conflist = append(c.conflist, conf)
return true
}
return false
}
//Delete the corresponding key values
func (c *Config) DeleteValue(section, name string) bool {
c.ReadList()
data := c.conflist
for i, v := range data {
for key, _ := range v {
if key == section {
delete(c.conflist[i][key], name)
return true
}
}
}
return false
}
//List all the configuration file
func (c *Config) ReadList() []map[string]map[string]string {
file, err := os.Open(c.filepath)
if err != nil {
CheckErr(err)
}
defer file.Close()
var data map[string]map[string]string
var section string
buf := bufio.NewReader(file)
for {
l, err := buf.ReadString('\n')
line := strings.TrimSpace(l)
if err != nil {
if err != io.EOF {
CheckErr(err)
}
if len(line) == 0 {
break
}
}
switch {
case len(line) == 0:
case line[0] == '[' && line[len(line)-1] == ']':
section = strings.TrimSpace(line[1 : len(line)-1])
data = make(map[string]map[string]string)
data[section] = make(map[string]string)
default:
i := strings.IndexAny(line, "=")
value := strings.TrimSpace(line[i+1 : len(line)])
data[section][strings.TrimSpace(line[0:i])] = value
if c.uniquappend(section) == true {
c.conflist = append(c.conflist, data)
}
}
}
return c.conflist
}
func CheckErr(err error) string {
if err != nil {
return fmt.Sprintf("Error is :'%s'", err.Error())
}
return "Notfound this error"
}
//Ban repeated appended to the slice method
func (c *Config) uniquappend(conf string) bool {
for _, v := range c.conflist {
for k, _ := range v {
if k == conf {
return false
}
}
}
return true
}
posted on 2016-11-24 16:13
思月行云 阅读(919)
评论(0) 编辑 收藏 引用 所属分类:
Golang