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.
2015-09-10 06:53:19 +00:00
// Package config is used to parse config
2014-08-18 08:41:43 +00:00
// Usage:
// import(
// "github.com/astaxie/beego/config"
// )
//
// cnf, err := config.NewConfig("ini", "config.conf")
//
// cnf APIS:
//
// cnf.Set(key, val string) error
// cnf.String(key string) string
// cnf.Strings(key string) []string
// cnf.Int(key string) (int, error)
// cnf.Int64(key string) (int64, error)
// cnf.Bool(key string) (bool, error)
// cnf.Float(key string) (float64, error)
2016-01-15 06:07:37 +00:00
// cnf.DefaultString(key string, defaultVal string) string
// cnf.DefaultStrings(key string, defaultVal []string) []string
// cnf.DefaultInt(key string, defaultVal int) int
// cnf.DefaultInt64(key string, defaultVal int64) int64
// cnf.DefaultBool(key string, defaultVal bool) bool
// cnf.DefaultFloat(key string, defaultVal float64) float64
2014-08-18 08:41:43 +00:00
// cnf.DIY(key string) (interface{}, error)
// cnf.GetSection(section string) (map[string]string, error)
// cnf.SaveConfigFile(filename string) error
2014-07-03 15:40:21 +00:00
//
2014-08-18 08:41:43 +00:00
// more docs http://beego.me/docs/module/config.md
2013-08-21 16:07:33 +00:00
package config
import (
"fmt"
)
2015-09-10 06:53:19 +00:00
// Configer defines how to get and set value from configuration raw data.
type Configer interface {
2016-01-15 06:07:37 +00:00
Set ( key , val string ) error //support section::key type in given key when using ini type.
String ( key string ) string //support section::key type in key string when using ini and json type; Int,Int64,Bool,Float,DIY are same.
2014-01-15 09:19:03 +00:00
Strings ( key string ) [ ] string //get string slice
2013-08-21 16:07:33 +00:00
Int ( key string ) ( int , error )
Int64 ( key string ) ( int64 , error )
Bool ( key string ) ( bool , error )
Float ( key string ) ( float64 , error )
2016-01-15 06:07:37 +00:00
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
2013-08-21 16:07:33 +00:00
DIY ( key string ) ( interface { } , 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
GetSection ( section string ) ( map [ string ] string , error )
SaveConfigFile ( filename string ) error
2013-08-21 16:07:33 +00:00
}
2015-09-10 06:53:19 +00:00
// Config is the adapter interface for parsing config file to get raw data to Configer.
2013-08-21 16:07:33 +00:00
type Config interface {
2015-09-10 06:53:19 +00:00
Parse ( key string ) ( Configer , error )
ParseData ( data [ ] byte ) ( Configer , error )
2013-08-21 16:07:33 +00:00
}
var adapters = make ( map [ string ] Config )
// Register makes a config adapter available by the adapter name.
// If Register is called twice with the same name or if driver is nil,
// it panics.
func Register ( name string , adapter Config ) {
if adapter == nil {
panic ( "config: Register adapter is nil" )
}
2014-07-12 08:03:14 +00:00
if _ , ok := adapters [ name ] ; ok {
2013-08-21 16:07:33 +00:00
panic ( "config: Register called twice for adapter " + name )
}
adapters [ name ] = adapter
}
2015-09-10 06:53:19 +00:00
// NewConfig adapterName is ini/json/xml/yaml.
2013-12-24 13:57:33 +00:00
// filename is the config file path.
2015-09-10 06:53:19 +00:00
func NewConfig ( adapterName , filename string ) ( Configer , error ) {
2013-08-21 16:07:33 +00:00
adapter , ok := adapters [ adapterName ]
if ! ok {
return nil , fmt . Errorf ( "config: unknown adaptername %q (forgotten import?)" , adapterName )
}
2015-08-26 08:57:28 +00:00
return adapter . Parse ( filename )
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
2015-09-10 06:53:19 +00:00
// NewConfigData adapterName is ini/json/xml/yaml.
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
// data is the config data.
2015-09-10 06:53:19 +00:00
func NewConfigData ( adapterName string , data [ ] byte ) ( Configer , 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
adapter , ok := adapters [ adapterName ]
if ! ok {
return nil , fmt . Errorf ( "config: unknown adaptername %q (forgotten import?)" , adapterName )
}
return adapter . ParseData ( data )
}
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
// 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.
func ParseBool ( val interface { } ) ( value bool , err error ) {
if val != nil {
switch v := val . ( type ) {
case bool :
return v , nil
case string :
switch v {
case "1" , "t" , "T" , "true" , "TRUE" , "True" , "YES" , "yes" , "Yes" , "Y" , "y" , "ON" , "on" , "On" :
return true , nil
case "0" , "f" , "F" , "false" , "FALSE" , "False" , "NO" , "no" , "No" , "N" , "n" , "OFF" , "off" , "Off" :
return false , nil
}
case int8 , int32 , int64 :
strV := fmt . Sprintf ( "%s" , v )
if strV == "1" {
return true , nil
} else if strV == "0" {
return false , nil
}
case float64 :
if v == 1 {
return true , nil
} else if v == 0 {
return false , nil
}
}
return false , fmt . Errorf ( "parsing %q: invalid syntax" , val )
} else {
return false , fmt . Errorf ( "parsing <nil>: invalid syntax" )
}
}