1 Star 0 Fork 9

Shirdon / go配置文件解析器

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
read.go 2.66 KB
一键复制 编辑 Web IDE 原始数据 按行查看 历史
shirdon 提交于 2019-07-07 15:08 . 上传
//++++++++++++++++++++++++++++++++++++++++
//Fighting for great,share generate value!
//Build the best soft by golang,let's go!
//++++++++++++++++++++++++++++++++++++++++
//Author:ShirDon <http://www.shirdon.com>
//Email:hcbsts@163.com; 823923263@qq.com
//++++++++++++++++++++++++++++++++++++++++
package config
import (
"bufio"
"errors"
"io"
"os"
"strings"
)
// _read is the base to read a file and get the configuration representation.
// That representation can be queried with GetString, etc.
func _read(fname string, c *Config) (*Config, error) {
file, err := os.Open(fname)
if err != nil {
return nil, err
}
if err = c.read(bufio.NewReader(file)); err != nil {
return nil, err
}
if err = file.Close(); err != nil {
return nil, err
}
return c, nil
}
// Read reads a configuration file and returns its representation.
// All arguments, except `fname`, are related to `New()`
func Read(fname string, comment, separator string, preSpace, postSpace bool) (*Config, error) {
return _read(fname, New(comment, separator, preSpace, postSpace))
}
// ReadDefault reads a configuration file and returns its representation.
// It uses values by default.
func ReadDefault(fname string) (*Config, error) {
return _read(fname, NewDefault())
}
// * * *
func (c *Config) read(buf *bufio.Reader) (err error) {
var section, option string
for {
l, err := buf.ReadString('\n') // parse line-by-line
if len(strings.TrimSpace(l)) == 0 {
if err == io.EOF {
break
} else if err != nil {
return err
}
}
l = strings.TrimSpace(l)
// Switch written for readability (not performance)
switch {
// Empty line and comments
case len(l) == 0, l[0] == '#', l[0] == ';':
continue
// New section
case l[0] == '[' && l[len(l)-1] == ']':
option = "" // reset multi-line value
section = strings.TrimSpace(l[1 : len(l)-1])
c.AddSection(section)
// No new section and no section defined so
//case section == "":
//return os.NewError("no section defined")
// Other alternatives
default:
i := strings.IndexAny(l, "=:")
switch {
// Option and value
case i > 0:
i := strings.IndexAny(l, "=:")
option = strings.TrimSpace(l[0:i])
value := strings.TrimSpace(stripComments(l[i+1:]))
c.AddOption(section, option, value)
// Continuation of multi-line value
case section != "" && option != "":
if MUTI_KEY_IDENTIFIER == string(option[0]) {
return errors.New("muti key not support muti line")
}
prev, _ := c.RawString(section, option)
value := strings.TrimSpace(stripComments(l))
c.AddOption(section, option, prev+"\n"+value)
default:
return errors.New("could not parse line: " + l)
}
}
}
return nil
}
Go
1
https://gitee.com/shirdon/configs_witch_go.git
git@gitee.com:shirdon/configs_witch_go.git
shirdon
configs_witch_go
go配置文件解析器
master

搜索帮助

14c37bed 8189591 565d56ea 8189591