MCPcopy Create free account
hub / github.com/devld/go-drive / parseValue

Function parseValue

script/utils.go:220–319  ·  view source on GitHub ↗
(ov *Value, v reflect.Value)

Source from the content-addressed store, hash-verified

218}
219
220func parseValue(ov *Value, v reflect.Value) {
221 if ov == nil || !v.IsValid() {
222 return
223 }
224 vt := v.Type()
225 switch v.Kind() {
226 case reflect.Ptr:
227 if ov.IsNil() {
228 return
229 }
230 if v.IsNil() {
231 value := reflect.New(vt.Elem())
232 v.Set(value)
233 }
234 parseValue(ov, v.Elem())
235 case reflect.Map:
236 keys := ov.Keys()
237 if keys == nil {
238 v.Set(reflect.Zero(vt))
239 return
240 }
241 valueType := vt.Elem()
242 r := reflect.MakeMapWithSize(v.Type(), len(keys))
243 for _, key := range keys {
244 value := reflect.New(valueType)
245 parseValue(ov.Get(key), value.Elem())
246 r.SetMapIndex(reflect.ValueOf(key), value.Elem())
247 }
248 v.Set(r)
249 case reflect.Slice:
250 arr := ov.Array()
251 if arr == nil {
252 v.Set(reflect.Zero(vt))
253 return
254 }
255 n := len(arr)
256 r := reflect.MakeSlice(vt, 0, n)
257
258 for i := 0; i < n; i++ {
259 value := reflect.New(vt.Elem())
260 parseValue(arr[i], value.Elem())
261 r = reflect.Append(r, value.Elem())
262 }
263 v.Set(r)
264 case reflect.Array:
265 arr := ov.Array()
266 if arr == nil {
267 v.Set(reflect.Zero(vt))
268 return
269 }
270 n := len(arr)
271 var arrLen = vt.Len()
272 r := reflect.New(reflect.ArrayOf(arrLen, vt.Elem()))
273 for i := 0; i < n && i < arrLen; i++ {
274 value := reflect.New(vt.Elem())
275 parseValue(arr[i], value.Elem())
276 r.Elem().Index(i).Set(value.Elem())
277 }

Callers 1

ParseIntoMethod · 0.85

Calls 12

IsNilMethod · 0.80
KeysMethod · 0.80
ArrayMethod · 0.80
IntegerMethod · 0.80
FloatMethod · 0.80
TypeMethod · 0.65
GetMethod · 0.65
LenMethod · 0.65
IndexMethod · 0.65
StringMethod · 0.65
SetMethod · 0.45
BoolMethod · 0.45

Tested by

no test coverage detected