go-micro.dev/v5@v5.12.0/config/reader/json/values.go (about)

     1  package json
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strconv"
     7  	"strings"
     8  	"time"
     9  
    10  	simple "github.com/bitly/go-simplejson"
    11  	"go-micro.dev/v5/config/reader"
    12  	"go-micro.dev/v5/config/source"
    13  )
    14  
    15  type jsonValues struct {
    16  	ch *source.ChangeSet
    17  	sj *simple.Json
    18  }
    19  
    20  type jsonValue struct {
    21  	*simple.Json
    22  }
    23  
    24  func NewValues(val []byte) (reader.Values, error) {
    25  	sj := simple.New()
    26  	data, _ := reader.ReplaceEnvVars(val)
    27  	if err := sj.UnmarshalJSON(data); err != nil {
    28  		sj.SetPath(nil, string(data))
    29  	}
    30  	return &jsonValues{sj: sj}, nil
    31  }
    32  
    33  func newValues(ch *source.ChangeSet) (reader.Values, error) {
    34  	sj := simple.New()
    35  	data, _ := reader.ReplaceEnvVars(ch.Data)
    36  	if err := sj.UnmarshalJSON(data); err != nil {
    37  		sj.SetPath(nil, string(ch.Data))
    38  	}
    39  	return &jsonValues{ch, sj}, nil
    40  }
    41  
    42  func (j *jsonValues) Get(path ...string) (reader.Value, error) {
    43  	return &jsonValue{j.sj.GetPath(path...)}, nil
    44  }
    45  
    46  func (j *jsonValues) Del(path ...string) {
    47  	// delete the tree?
    48  	if len(path) == 0 {
    49  		j.sj = simple.New()
    50  		return
    51  	}
    52  
    53  	if len(path) == 1 {
    54  		j.sj.Del(path[0])
    55  		return
    56  	}
    57  
    58  	vals := j.sj.GetPath(path[:len(path)-1]...)
    59  	vals.Del(path[len(path)-1])
    60  	j.sj.SetPath(path[:len(path)-1], vals.Interface())
    61  	return
    62  }
    63  
    64  func (j *jsonValues) Set(val interface{}, path ...string) {
    65  	j.sj.SetPath(path, val)
    66  }
    67  
    68  func (j *jsonValues) Bytes() []byte {
    69  	b, _ := j.sj.MarshalJSON()
    70  	return b
    71  }
    72  
    73  func (j *jsonValues) Map() map[string]interface{} {
    74  	m, _ := j.sj.Map()
    75  	return m
    76  }
    77  
    78  func (j *jsonValues) Scan(v interface{}) error {
    79  	b, err := j.sj.MarshalJSON()
    80  	if err != nil {
    81  		return err
    82  	}
    83  	return json.Unmarshal(b, v)
    84  }
    85  
    86  func (j *jsonValues) String() string {
    87  	return "json"
    88  }
    89  
    90  func (j *jsonValue) Bool(def bool) bool {
    91  	b, err := j.Json.Bool()
    92  	if err == nil {
    93  		return b
    94  	}
    95  
    96  	str, ok := j.Interface().(string)
    97  	if !ok {
    98  		return def
    99  	}
   100  
   101  	b, err = strconv.ParseBool(str)
   102  	if err != nil {
   103  		return def
   104  	}
   105  
   106  	return b
   107  }
   108  
   109  func (j *jsonValue) Int(def int) int {
   110  	i, err := j.Json.Int()
   111  	if err == nil {
   112  		return i
   113  	}
   114  
   115  	str, ok := j.Interface().(string)
   116  	if !ok {
   117  		return def
   118  	}
   119  
   120  	i, err = strconv.Atoi(str)
   121  	if err != nil {
   122  		return def
   123  	}
   124  
   125  	return i
   126  }
   127  
   128  func (j *jsonValue) String(def string) string {
   129  	return j.Json.MustString(def)
   130  }
   131  
   132  func (j *jsonValue) Float64(def float64) float64 {
   133  	f, err := j.Json.Float64()
   134  	if err == nil {
   135  		return f
   136  	}
   137  
   138  	str, ok := j.Interface().(string)
   139  	if !ok {
   140  		return def
   141  	}
   142  
   143  	f, err = strconv.ParseFloat(str, 64)
   144  	if err != nil {
   145  		return def
   146  	}
   147  
   148  	return f
   149  }
   150  
   151  func (j *jsonValue) Duration(def time.Duration) time.Duration {
   152  	v, err := j.Json.String()
   153  	if err != nil {
   154  		return def
   155  	}
   156  
   157  	value, err := time.ParseDuration(v)
   158  	if err != nil {
   159  		return def
   160  	}
   161  
   162  	return value
   163  }
   164  
   165  func (j *jsonValue) StringSlice(def []string) []string {
   166  	v, err := j.Json.String()
   167  	if err == nil {
   168  		sl := strings.Split(v, ",")
   169  		if len(sl) > 0 {
   170  			return sl
   171  		}
   172  	}
   173  	return j.Json.MustStringArray(def)
   174  }
   175  
   176  func (j *jsonValue) StringMap(def map[string]string) map[string]string {
   177  	m, err := j.Json.Map()
   178  	if err != nil {
   179  		return def
   180  	}
   181  
   182  	res := map[string]string{}
   183  
   184  	for k, v := range m {
   185  		res[k] = fmt.Sprintf("%v", v)
   186  	}
   187  
   188  	return res
   189  }
   190  
   191  func (j *jsonValue) Scan(v interface{}) error {
   192  	b, err := j.Json.MarshalJSON()
   193  	if err != nil {
   194  		return err
   195  	}
   196  	return json.Unmarshal(b, v)
   197  }
   198  
   199  func (j *jsonValue) Bytes() []byte {
   200  	b, err := j.Json.Bytes()
   201  	if err != nil {
   202  		// try return marshaled
   203  		b, err = j.Json.MarshalJSON()
   204  		if err != nil {
   205  			return []byte{}
   206  		}
   207  		return b
   208  	}
   209  	return b
   210  }