216 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package config
 | |
| 
 | |
| import (
 | |
| 	"encoding/json"
 | |
| 	"fmt"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"time"
 | |
| 
 | |
| 	simple "github.com/bitly/go-simplejson"
 | |
| )
 | |
| 
 | |
| type JSONValues struct {
 | |
| 	values []byte
 | |
| 	sj     *simple.Json
 | |
| }
 | |
| 
 | |
| type JSONValue struct {
 | |
| 	*simple.Json
 | |
| }
 | |
| 
 | |
| func NewJSONValues(data []byte) *JSONValues {
 | |
| 	sj := simple.New()
 | |
| 
 | |
| 	if err := sj.UnmarshalJSON(data); err != nil {
 | |
| 		sj.SetPath(nil, string(data))
 | |
| 	}
 | |
| 	return &JSONValues{data, sj}
 | |
| }
 | |
| 
 | |
| func NewJSONValue(data []byte) *JSONValue {
 | |
| 	sj := simple.New()
 | |
| 
 | |
| 	if err := sj.UnmarshalJSON(data); err != nil {
 | |
| 		sj.SetPath(nil, string(data))
 | |
| 	}
 | |
| 	return &JSONValue{sj}
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Get(path string, options ...Option) Value {
 | |
| 	paths := strings.Split(path, ".")
 | |
| 	return &JSONValue{j.sj.GetPath(paths...)}
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Delete(path string, options ...Option) {
 | |
| 	paths := strings.Split(path, ".")
 | |
| 	// delete the tree?
 | |
| 	if len(paths) == 0 {
 | |
| 		j.sj = simple.New()
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if len(paths) == 1 {
 | |
| 		j.sj.Del(paths[0])
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	vals := j.sj.GetPath(paths[:len(paths)-1]...)
 | |
| 	vals.Del(paths[len(paths)-1])
 | |
| 	j.sj.SetPath(paths[:len(paths)-1], vals.Interface())
 | |
| 	return
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Set(path string, val interface{}, options ...Option) {
 | |
| 	paths := strings.Split(path, ".")
 | |
| 	j.sj.SetPath(paths, val)
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Bytes() []byte {
 | |
| 	b, _ := j.sj.MarshalJSON()
 | |
| 	return b
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Map() map[string]interface{} {
 | |
| 	m, _ := j.sj.Map()
 | |
| 	return m
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) Scan(v interface{}) error {
 | |
| 	b, err := j.sj.MarshalJSON()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return json.Unmarshal(b, v)
 | |
| }
 | |
| 
 | |
| func (j *JSONValues) String() string {
 | |
| 	return "json"
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Bool(def bool) bool {
 | |
| 	b, err := j.Json.Bool()
 | |
| 	if err == nil {
 | |
| 		return b
 | |
| 	}
 | |
| 
 | |
| 	str, ok := j.Interface().(string)
 | |
| 	if !ok {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	b, err = strconv.ParseBool(str)
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	return b
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Int(def int) int {
 | |
| 	i, err := j.Json.Int()
 | |
| 	if err == nil {
 | |
| 		return i
 | |
| 	}
 | |
| 
 | |
| 	str, ok := j.Interface().(string)
 | |
| 	if !ok {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	i, err = strconv.Atoi(str)
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	return i
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) String(def string) string {
 | |
| 	return j.Json.MustString(def)
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Float64(def float64) float64 {
 | |
| 	f, err := j.Json.Float64()
 | |
| 	if err == nil {
 | |
| 		return f
 | |
| 	}
 | |
| 
 | |
| 	str, ok := j.Interface().(string)
 | |
| 	if !ok {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	f, err = strconv.ParseFloat(str, 64)
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	return f
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Duration(def time.Duration) time.Duration {
 | |
| 	v, err := j.Json.String()
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	value, err := time.ParseDuration(v)
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	return value
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) StringSlice(def []string) []string {
 | |
| 	v, err := j.Json.String()
 | |
| 	if err == nil {
 | |
| 		sl := strings.Split(v, ",")
 | |
| 		if len(sl) > 1 {
 | |
| 			return sl
 | |
| 		}
 | |
| 	}
 | |
| 	return j.Json.MustStringArray(def)
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Exists() bool {
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) StringMap(def map[string]string) map[string]string {
 | |
| 	m, err := j.Json.Map()
 | |
| 	if err != nil {
 | |
| 		return def
 | |
| 	}
 | |
| 
 | |
| 	res := map[string]string{}
 | |
| 
 | |
| 	for k, v := range m {
 | |
| 		res[k] = fmt.Sprintf("%v", v)
 | |
| 	}
 | |
| 
 | |
| 	return res
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Scan(v interface{}) error {
 | |
| 	b, err := j.Json.MarshalJSON()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return json.Unmarshal(b, v)
 | |
| }
 | |
| 
 | |
| func (j *JSONValue) Bytes() []byte {
 | |
| 	b, err := j.Json.Bytes()
 | |
| 	if err != nil {
 | |
| 		// try return marshalled
 | |
| 		b, err = j.Json.MarshalJSON()
 | |
| 		if err != nil {
 | |
| 			return []byte{}
 | |
| 		}
 | |
| 		return b
 | |
| 	}
 | |
| 	return b
 | |
| }
 |