mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-12 17:32:27 +08:00
117 lines
1.8 KiB
Go
117 lines
1.8 KiB
Go
package config
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"flag"
|
|
"io/ioutil"
|
|
|
|
"qiniupkg.com/x/log.v7"
|
|
)
|
|
|
|
var (
|
|
confName *string
|
|
)
|
|
|
|
func Init(cflag, app, default_conf string) {
|
|
|
|
confDir, _ := GetDir(app)
|
|
confName = flag.String(cflag, confDir+"/"+default_conf, "the config file")
|
|
}
|
|
|
|
func GetPath() string {
|
|
|
|
if confName != nil {
|
|
return *confName
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func Load(conf interface{}) (err error) {
|
|
|
|
if !flag.Parsed() {
|
|
flag.Parse()
|
|
}
|
|
|
|
log.Info("Use the config file of ", *confName)
|
|
return LoadEx(conf, *confName)
|
|
}
|
|
|
|
func LoadEx(conf interface{}, confName string) (err error) {
|
|
|
|
data, err := ioutil.ReadFile(confName)
|
|
if err != nil {
|
|
log.Error("Load conf failed:", err)
|
|
return
|
|
}
|
|
data = trimComments(data)
|
|
|
|
err = json.Unmarshal(data, conf)
|
|
if err != nil {
|
|
log.Error("Parse conf failed:", err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func LoadFile(conf interface{}, confName string) (err error) {
|
|
|
|
data, err := ioutil.ReadFile(confName)
|
|
if err != nil {
|
|
return
|
|
}
|
|
data = trimComments(data)
|
|
|
|
return json.Unmarshal(data, conf)
|
|
}
|
|
|
|
func LoadBytes(conf interface{}, data []byte) (err error) {
|
|
|
|
return json.Unmarshal(trimComments(data), conf)
|
|
}
|
|
|
|
func LoadString(conf interface{}, data string) (err error) {
|
|
|
|
return json.Unmarshal(trimComments([]byte(data)), conf)
|
|
}
|
|
|
|
func trimComments(data []byte) (data1 []byte) {
|
|
|
|
var line []byte
|
|
|
|
data1 = data[:0]
|
|
for {
|
|
pos := bytes.IndexByte(data, '\n')
|
|
if pos < 0 {
|
|
line = data
|
|
} else {
|
|
line = data[:pos+1]
|
|
}
|
|
data1 = append(data1, trimCommentsLine(line)...)
|
|
if pos < 0 {
|
|
return
|
|
}
|
|
data = data[pos+1:]
|
|
}
|
|
}
|
|
|
|
func trimCommentsLine(line []byte) []byte {
|
|
|
|
n := len(line)
|
|
quoteCount := 0
|
|
for i := 0; i < n; i++ {
|
|
c := line[i]
|
|
switch c {
|
|
case '\\':
|
|
i++
|
|
case '"':
|
|
quoteCount++
|
|
case '#':
|
|
if (quoteCount&1) == 0 {
|
|
return line[:i]
|
|
}
|
|
}
|
|
}
|
|
return line
|
|
}
|
|
|