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 }