new project
This commit is contained in:
parent
319a5e0304
commit
1869fc6de7
9
.gitignore
vendored
Normal file
9
.gitignore
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Created by .ignore support plugin (hsz.mobi)
|
||||||
|
### Example user template template
|
||||||
|
### Example user template
|
||||||
|
|
||||||
|
# IntelliJ project files
|
||||||
|
.idea
|
||||||
|
*.iml
|
||||||
|
out
|
||||||
|
gen
|
104
grconfig.go
Normal file
104
grconfig.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
package grconfig
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ConfigerChannelInterface interface {
|
||||||
|
Item(item string, t interface{}) (err error)
|
||||||
|
String(item string) string
|
||||||
|
}
|
||||||
|
|
||||||
|
type Configer struct {
|
||||||
|
channels map[string]ConfigerChannelInterface
|
||||||
|
root string
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(root string) *Configer {
|
||||||
|
return &Configer{root: root, channels: map[string]ConfigerChannelInterface{}}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conf *Configer) getData(item string) (ch ConfigerChannelInterface, err error) {
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
env := os.Getenv("CENTER_RUNMODE")
|
||||||
|
chunks := strings.SplitN(item, ".", 2)
|
||||||
|
|
||||||
|
if len(chunks) < 2 {
|
||||||
|
panic("Item string error")
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.TrimSpace(env) == "" {
|
||||||
|
env = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if ch, ok = conf.channels[chunks[0]]; !ok {
|
||||||
|
|
||||||
|
var fd *os.File
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
// @TODO 检查配置
|
||||||
|
fpath := path.Join(conf.root, env, chunks[0]+"."+"yaml")
|
||||||
|
|
||||||
|
if fd, err = os.Open(fpath); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err = buf.ReadFrom(fd); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// @TODO
|
||||||
|
ch = &ConfigerChannelYAML{
|
||||||
|
tmp: parseYAML(buf),
|
||||||
|
filename: chunks[0],
|
||||||
|
}
|
||||||
|
conf.channels[chunks[0]] = ch
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conf *Configer) Item(item string, t interface{}) (err error) {
|
||||||
|
ch, err1 := conf.getData(item)
|
||||||
|
if err1 != nil {
|
||||||
|
return err1
|
||||||
|
}
|
||||||
|
return ch.Item(item, t)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conf *Configer) String(item string) string {
|
||||||
|
ch, err1 := conf.getData(item)
|
||||||
|
if err1 != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return ch.String(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
func recursiveParse(item string, v interface{}) interface{} {
|
||||||
|
|
||||||
|
chunks := strings.SplitN(item, ".", 2)
|
||||||
|
|
||||||
|
if n, err := strconv.Atoi(chunks[0]); err == nil {
|
||||||
|
|
||||||
|
if tmp, ok := v.([]interface{}); reflect.TypeOf(v).Kind() == reflect.Slice && ok {
|
||||||
|
v = tmp[n]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if tmp, ok := v.(map[interface{}]interface{}); reflect.TypeOf(v).Kind() == reflect.Map && ok {
|
||||||
|
v = tmp[chunks[0]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(chunks) <= 1 {
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
return recursiveParse(chunks[1], v)
|
||||||
|
}
|
38
grconfig_test.go
Normal file
38
grconfig_test.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package grconfig
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"lot.gaore.com/library/common"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
ServerUrl string `yaml:"server_url"`
|
||||||
|
AccessKey string `yaml:"access_key"`
|
||||||
|
SecretKey string `yaml:"secret_key"`
|
||||||
|
InstanceId string `yaml:"instance_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewConfig(t *testing.T) {
|
||||||
|
var m1 Config
|
||||||
|
var m2 Config
|
||||||
|
c := New(common.GetCwd("conf"))
|
||||||
|
err := c.Item("mqtt.default", &m1)
|
||||||
|
log.Println(fmt.Sprintf("%+v", m1.ServerUrl))
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = c.Item("mqtt.backup", &m2)
|
||||||
|
log.Println(fmt.Sprintf("%+v", m2.ServerUrl))
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.String("mqtt.default.instance_id") == "" {
|
||||||
|
t.Error("Empty String")
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Println(c.String("mqtt.default.instance_id"))
|
||||||
|
}
|
17
xml.go
Normal file
17
xml.go
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package grconfig
|
||||||
|
|
||||||
|
import "bytes"
|
||||||
|
|
||||||
|
type ConfigerChannelXML struct {
|
||||||
|
io bytes.Buffer
|
||||||
|
filename string
|
||||||
|
adapter string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c ConfigerChannelXML) Item(item string, t interface{}) (err error) {
|
||||||
|
panic("implement me")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c ConfigerChannelXML) String(s string) string {
|
||||||
|
panic("implement me")
|
||||||
|
}
|
41
yaml.go
Normal file
41
yaml.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package grconfig
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ConfigerChannelYAML struct {
|
||||||
|
tmp interface{}
|
||||||
|
filename string
|
||||||
|
adapter string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conf *ConfigerChannelYAML) String(item string) string {
|
||||||
|
chunks := strings.SplitN(item, ".", 2)
|
||||||
|
target := recursiveParse(chunks[1], conf.tmp)
|
||||||
|
if str, ok := target.(string); ok {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conf *ConfigerChannelYAML) Item(item string, t interface{}) (err error) {
|
||||||
|
chunks := strings.SplitN(item, ".", 2)
|
||||||
|
target := recursiveParse(chunks[1], conf.tmp)
|
||||||
|
if target == nil {
|
||||||
|
err = errors.New("item doesn't exists")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
out, _ := yaml.Marshal(target)
|
||||||
|
err = yaml.Unmarshal(out, t)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseYAML(buf bytes.Buffer) interface{} {
|
||||||
|
var v interface{}
|
||||||
|
yaml.Unmarshal(buf.Bytes(), &v)
|
||||||
|
return v
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user