mirror of https://github.com/shunfei/cronsun
conf: 替换 confutil 包
parent
7ccdfcaf10
commit
7f7e6b4ae4
|
@ -9,10 +9,11 @@ import (
|
|||
"github.com/fsnotify/fsnotify"
|
||||
"github.com/go-gomail/gomail"
|
||||
|
||||
"sunteng/commons/confutil"
|
||||
"sunteng/commons/db/imgo"
|
||||
"sunteng/commons/event"
|
||||
"sunteng/commons/log"
|
||||
|
||||
"github.com/shunfei/cronsun/utils"
|
||||
)
|
||||
|
||||
var (
|
||||
|
@ -113,7 +114,7 @@ func cleanKeyPrefix(p string) string {
|
|||
}
|
||||
|
||||
func (c *Conf) parse() error {
|
||||
err := confutil.LoadExtendConf(*confFile, c)
|
||||
err := utils.LoadExtendConf(*confFile, c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
// 加载json(可配置扩展字段)配置文件
|
||||
//
|
||||
// {
|
||||
// "Debug": true,
|
||||
// "Log": "@extend:./log.json"
|
||||
// }
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
)
|
||||
|
||||
var (
|
||||
extendTag = "@extend:"
|
||||
pwdTag = "@pwd@"
|
||||
rootTag = "@root@"
|
||||
root = ""
|
||||
)
|
||||
|
||||
// 设置扩展标识,如果不设置,默认为 '@extend:'
|
||||
func SetExtendTag(tag string) {
|
||||
extendTag = tag
|
||||
}
|
||||
|
||||
func SetRoot(r string) {
|
||||
root = r
|
||||
}
|
||||
|
||||
// 设置当前路径标识,如果不设置,默认为 '@pwd@'
|
||||
// @pwd@ 会被替换成当前文件的路径,
|
||||
// 至于是绝对路径还是相对路径,取决于读取文件时,传入的是绝对路径还是相对路径
|
||||
func SetPathTag(tag string) {
|
||||
pwdTag = tag
|
||||
}
|
||||
|
||||
//加载json(可配置扩展字段)配置文件
|
||||
func LoadExtendConf(filePath string, v interface{}) error {
|
||||
data, err := extendFile(filePath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.Unmarshal(data, v)
|
||||
}
|
||||
|
||||
func extendFile(filePath string) (data []byte, err error) {
|
||||
fi, err := os.Stat(filePath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if fi.IsDir() {
|
||||
err = fmt.Errorf(filePath + " is not a file.")
|
||||
return
|
||||
}
|
||||
|
||||
b, err := ioutil.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(root) != 0 {
|
||||
b = bytes.Replace(b, []byte(rootTag), []byte(root), -1)
|
||||
}
|
||||
|
||||
dir := filepath.Dir(filePath)
|
||||
return extendFileContent(dir, bytes.Replace(b, []byte(pwdTag), []byte(dir), -1))
|
||||
}
|
||||
|
||||
func extendFileContent(dir string, content []byte) (data []byte, err error) {
|
||||
//检查是不是规范的json
|
||||
test := new(interface{})
|
||||
err = json.Unmarshal(content, &test)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// 替换子json文件
|
||||
reg := regexp.MustCompile(`"` + extendTag + `.*?"`)
|
||||
data = reg.ReplaceAllFunc(content, func(match []byte) []byte {
|
||||
match = match[len(extendTag)+1 : len(match)-1]
|
||||
sb, e := extendFile(filepath.Join(dir, string(match)))
|
||||
if e != nil {
|
||||
err = fmt.Errorf("替换json配置[%s]失败:%s\n", match, e.Error())
|
||||
}
|
||||
return sb
|
||||
})
|
||||
return
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
. "github.com/smartystreets/goconvey/convey"
|
||||
)
|
||||
|
||||
func TestLoadExtendConf(t *testing.T) {
|
||||
testFile := "test.json"
|
||||
|
||||
type conf struct {
|
||||
Debug bool
|
||||
Num int
|
||||
Log struct {
|
||||
Level int
|
||||
Path string
|
||||
}
|
||||
}
|
||||
Convey("confutil package test", t, func() {
|
||||
Convey("load test file should be success", func() {
|
||||
c := &conf{}
|
||||
err := LoadExtendConf(testFile, c)
|
||||
So(err, ShouldBeNil)
|
||||
So(c.Debug, ShouldBeTrue)
|
||||
So(c.Log.Path, ShouldEqual, "./tmp")
|
||||
})
|
||||
})
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"Debug": true,
|
||||
"Num": 1,
|
||||
"Log": "@extend:test1.json"
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"Level": 2,
|
||||
"Path": "@pwd@/tmp"
|
||||
}
|
Loading…
Reference in New Issue