2013-08-21 16:07:33 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"strconv"
|
2014-01-15 09:19:03 +00:00
|
|
|
"strings"
|
2013-08-21 16:07:33 +00:00
|
|
|
"sync"
|
2013-12-03 13:37:39 +00:00
|
|
|
|
|
|
|
"github.com/beego/x2j"
|
2013-08-21 16:07:33 +00:00
|
|
|
)
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// XmlConfig is a xml config parser and implements Config interface.
|
|
|
|
// xml configurations should be included in <config></config> tag.
|
|
|
|
// only support key/value pair as <key>value</key> as each item.
|
2013-08-21 16:07:33 +00:00
|
|
|
type XMLConfig struct {
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Parse returns a ConfigContainer with parsed xml config map.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (xmls *XMLConfig) Parse(filename string) (ConfigContainer, error) {
|
|
|
|
file, err := os.Open(filename)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
defer file.Close()
|
|
|
|
x := &XMLConfigContainer{
|
|
|
|
data: make(map[string]interface{}),
|
|
|
|
}
|
|
|
|
content, err := ioutil.ReadAll(file)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
d, err := x2j.DocToMap(string(content))
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
x.data = d["config"].(map[string]interface{})
|
|
|
|
return x, nil
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// A Config represents the xml configuration.
|
2013-08-21 16:07:33 +00:00
|
|
|
type XMLConfigContainer struct {
|
|
|
|
data map[string]interface{}
|
|
|
|
sync.Mutex
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Bool returns the boolean value for a given key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) Bool(key string) (bool, error) {
|
|
|
|
return strconv.ParseBool(c.data[key].(string))
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Int returns the integer value for a given key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) Int(key string) (int, error) {
|
|
|
|
return strconv.Atoi(c.data[key].(string))
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Int64 returns the int64 value for a given key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) Int64(key string) (int64, error) {
|
|
|
|
return strconv.ParseInt(c.data[key].(string), 10, 64)
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// Float returns the float value for a given key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) Float(key string) (float64, error) {
|
|
|
|
return strconv.ParseFloat(c.data[key].(string), 64)
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// String returns the string value for a given key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) String(key string) string {
|
|
|
|
if v, ok := c.data[key].(string); ok {
|
|
|
|
return v
|
|
|
|
}
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
2014-01-15 09:19:03 +00:00
|
|
|
// Strings returns the []string value for a given key.
|
|
|
|
func (c *XMLConfigContainer) Strings(key string) []string {
|
|
|
|
return strings.Split(c.String(key), ";")
|
|
|
|
}
|
|
|
|
|
2013-12-24 13:57:33 +00:00
|
|
|
// WriteValue writes a new value for key.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) Set(key, val string) error {
|
|
|
|
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.
|
2013-08-21 16:07:33 +00:00
|
|
|
func (c *XMLConfigContainer) DIY(key string) (v interface{}, err error) {
|
|
|
|
if v, ok := c.data[key]; ok {
|
|
|
|
return v, nil
|
|
|
|
}
|
|
|
|
return nil, errors.New("not exist key")
|
|
|
|
}
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
Register("xml", &XMLConfig{})
|
|
|
|
}
|