2014-08-18 08:41:43 +00:00
|
|
|
// Copyright 2014 beego Author. All Rights Reserved.
|
2014-07-03 15:40:21 +00:00
|
|
|
//
|
2014-08-18 08:41:43 +00:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
2014-07-03 15:40:21 +00:00
|
|
|
//
|
2014-08-18 08:41:43 +00:00
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
2014-07-03 15:40:21 +00:00
|
|
|
//
|
2014-08-18 08:41:43 +00:00
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
2013-08-21 16:07:33 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
Support Parse Bool with more diffrent values
ParseBool returns the boolean value represented by the string.
It accepts 1, 1.0, t, T, TRUE, true, True, YES, yes, Yes,Y, y, ON, on,
On,
0, 0.0, f, F, FALSE, false, False, NO, no, No, N,n, OFF, off, Off.
Any other value returns an error.
2016-01-23 03:02:40 +00:00
|
|
|
"fmt"
|
2013-08-21 16:07:33 +00:00
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
2013-12-10 10:09:58 +00:00
|
|
|
"strings"
|
2013-08-21 16:07:33 +00:00
|
|
|
"sync"
|
|
|
|
)
|
|
|
|
|
2015-09-10 06:53:19 +00:00
|
|
|
// JSONConfig is a json config parser and implements Config interface.
|
|
|
|
type JSONConfig struct {
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Parse returns a ConfigContainer with parsed json config map.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (js *JSONConfig) Parse(filename string) (Configer, error) {
|
2013-08-21 16:07:33 +00:00
|
|
|
file, err := os.Open(filename)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
content, err := ioutil.ReadAll(file)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
|
|
|
|
return js.ParseData(content)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseData returns a ConfigContainer with json string
|
2015-09-10 06:53:19 +00:00
|
|
|
func (js *JSONConfig) ParseData(data []byte) (Configer, error) {
|
|
|
|
x := &JSONConfigContainer{
|
2014-07-15 02:01:26 +00:00
|
|
|
data: make(map[string]interface{}),
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
err := json.Unmarshal(data, &x.data)
|
2013-08-21 16:07:33 +00:00
|
|
|
if err != nil {
|
2014-06-11 08:33:32 +00:00
|
|
|
var wrappingArray []interface{}
|
2014-12-17 09:02:46 +00:00
|
|
|
err2 := json.Unmarshal(data, &wrappingArray)
|
2014-06-11 08:33:32 +00:00
|
|
|
if err2 != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
x.data["rootArray"] = wrappingArray
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
return x, nil
|
|
|
|
}
|
|
|
|
|
2015-09-10 06:53:19 +00:00
|
|
|
// JSONConfigContainer A Config represents the json configuration.
|
2013-12-24 13:57:33 +00:00
|
|
|
// Only when get value, support key as section:name type.
|
2015-09-10 06:53:19 +00:00
|
|
|
type JSONConfigContainer struct {
|
2013-08-21 16:07:33 +00:00
|
|
|
data map[string]interface{}
|
2013-12-10 10:09:58 +00:00
|
|
|
sync.RWMutex
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Bool returns the boolean value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Bool(key string) (bool, error) {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
Support Parse Bool with more diffrent values
ParseBool returns the boolean value represented by the string.
It accepts 1, 1.0, t, T, TRUE, true, True, YES, yes, Yes,Y, y, ON, on,
On,
0, 0.0, f, F, FALSE, false, False, NO, no, No, N,n, OFF, off, Off.
Any other value returns an error.
2016-01-23 03:02:40 +00:00
|
|
|
return ParseBool(val)
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
Support Parse Bool with more diffrent values
ParseBool returns the boolean value represented by the string.
It accepts 1, 1.0, t, T, TRUE, true, True, YES, yes, Yes,Y, y, ON, on,
On,
0, 0.0, f, F, FALSE, false, False, NO, no, No, N,n, OFF, off, Off.
Any other value returns an error.
2016-01-23 03:02:40 +00:00
|
|
|
return false, fmt.Errorf("not exist key: %q", key)
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultBool return the bool value if has no error
|
|
|
|
// otherwise return the defaultval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultBool(key string, defaultval bool) bool {
|
2014-12-17 09:02:46 +00:00
|
|
|
if v, err := c.Bool(key); err == nil {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Int returns the integer value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Int(key string) (int, error) {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
|
|
|
if v, ok := val.(float64); ok {
|
|
|
|
return int(v), nil
|
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0, errors.New("not int value")
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0, errors.New("not exist key:" + key)
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultInt returns the integer value for a given key.
|
|
|
|
// if err != nil return defaltval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultInt(key string, defaultval int) int {
|
2014-12-17 09:02:46 +00:00
|
|
|
if v, err := c.Int(key); err == nil {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Int64 returns the int64 value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Int64(key string) (int64, error) {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
|
|
|
if v, ok := val.(float64); ok {
|
|
|
|
return int64(v), nil
|
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0, errors.New("not int64 value")
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0, errors.New("not exist key:" + key)
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultInt64 returns the int64 value for a given key.
|
|
|
|
// if err != nil return defaltval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultInt64(key string, defaultval int64) int64 {
|
2014-12-17 09:02:46 +00:00
|
|
|
if v, err := c.Int64(key); err == nil {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Float returns the float value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Float(key string) (float64, error) {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
|
|
|
if v, ok := val.(float64); ok {
|
|
|
|
return v, nil
|
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0.0, errors.New("not float64 value")
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return 0.0, errors.New("not exist key:" + key)
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultFloat returns the float64 value for a given key.
|
|
|
|
// if err != nil return defaltval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultFloat(key string, defaultval float64) float64 {
|
2014-12-17 09:02:46 +00:00
|
|
|
if v, err := c.Float(key); err == nil {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// String returns the string value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) String(key string) string {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
|
|
|
if v, ok := val.(string); ok {
|
|
|
|
return v
|
|
|
|
}
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return ""
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultString returns the string value for a given key.
|
|
|
|
// if err != nil return defaltval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultString(key string, defaultval string) string {
|
2016-01-17 15:48:17 +00:00
|
|
|
// TODO FIXME should not use "" to replace non existence
|
2014-12-17 09:02:46 +00:00
|
|
|
if v := c.String(key); v != "" {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
2014-01-15 09:19:03 +00:00
|
|
|
// Strings returns the []string value for a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Strings(key string) []string {
|
2014-12-17 09:02:46 +00:00
|
|
|
stringVal := c.String(key)
|
|
|
|
if stringVal == "" {
|
|
|
|
return []string{}
|
|
|
|
}
|
2014-01-15 09:19:03 +00:00
|
|
|
return strings.Split(c.String(key), ";")
|
|
|
|
}
|
|
|
|
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// DefaultStrings returns the []string value for a given key.
|
|
|
|
// if err != nil return defaltval
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DefaultStrings(key string, defaultval []string) []string {
|
2014-12-17 09:02:46 +00:00
|
|
|
if v := c.Strings(key); len(v) > 0 {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
return v
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return defaultval
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetSection returns map for the given section
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) GetSection(section string) (map[string]string, error) {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
if v, ok := c.data[section]; ok {
|
|
|
|
return v.(map[string]string), nil
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
return nil, errors.New("nonexist section " + section)
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// SaveConfigFile save the config into file
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) SaveConfigFile(filename string) (err error) {
|
config: add more method
DefaultString(key string, defaultval string) string // support
section::key type in key string when using ini and json type;
Int,Int64,Bool,Float,DIY are same.
DefaultStrings(key string, defaultval []string) []string //get string
slice
DefaultInt(key string, defaultval int) int
DefaultInt64(key string, defaultval int64) int64
DefaultBool(key string, defaultval bool) bool
DefaultFloat(key string, defaultval float64) float64
DIY(key string) (interface{}, error)
GetSection(section string) (map[string]string, error)
SaveConfigFile(filename string) error
2014-08-07 09:24:21 +00:00
|
|
|
// Write configuration file by filename.
|
|
|
|
f, err := os.Create(filename)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
defer f.Close()
|
|
|
|
b, err := json.MarshalIndent(c.data, "", " ")
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
_, err = f.Write(b)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2014-12-17 09:02:46 +00:00
|
|
|
// Set writes a new value for key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) Set(key, val string) error {
|
2013-08-21 16:07:33 +00:00
|
|
|
c.Lock()
|
|
|
|
defer c.Unlock()
|
|
|
|
c.data[key] = val
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// DIY returns the raw value by a given key.
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) DIY(key string) (v interface{}, err error) {
|
2014-07-17 07:56:06 +00:00
|
|
|
val := c.getData(key)
|
2013-12-10 10:09:58 +00:00
|
|
|
if val != nil {
|
|
|
|
return val, nil
|
|
|
|
}
|
2014-07-15 02:01:26 +00:00
|
|
|
return nil, errors.New("not exist key")
|
2013-12-10 10:09:58 +00:00
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// section.key or key
|
2015-09-10 06:53:19 +00:00
|
|
|
func (c *JSONConfigContainer) getData(key string) interface{} {
|
2013-12-10 10:09:58 +00:00
|
|
|
if len(key) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
|
|
|
|
c.RLock()
|
|
|
|
defer c.RUnlock()
|
|
|
|
|
|
|
|
sectionKeys := strings.Split(key, "::")
|
|
|
|
if len(sectionKeys) >= 2 {
|
|
|
|
curValue, ok := c.data[sectionKeys[0]]
|
2014-07-17 07:49:40 +00:00
|
|
|
if !ok {
|
|
|
|
return nil
|
|
|
|
}
|
2014-12-17 09:02:46 +00:00
|
|
|
for _, key := range sectionKeys[1:] {
|
2014-07-17 07:49:40 +00:00
|
|
|
if v, ok := curValue.(map[string]interface{}); ok {
|
2014-07-17 08:48:10 +00:00
|
|
|
if curValue, ok = v[key]; !ok {
|
|
|
|
return nil
|
2014-07-15 02:01:26 +00:00
|
|
|
}
|
2013-12-10 10:09:58 +00:00
|
|
|
}
|
|
|
|
}
|
2014-07-17 08:48:10 +00:00
|
|
|
return curValue
|
2014-07-15 02:01:26 +00:00
|
|
|
}
|
|
|
|
if v, ok := c.data[key]; ok {
|
|
|
|
return v
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
2013-12-10 10:09:58 +00:00
|
|
|
return nil
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
2015-09-10 06:53:19 +00:00
|
|
|
Register("json", &JSONConfig{})
|
2013-08-21 16:07:33 +00:00
|
|
|
}
|