Skip to content

Commit 42eebfc

Browse files
author
roman.tarasov
committed
extrac func
1 parent 4fcd01b commit 42eebfc

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

bson/decode.go

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ func (r *peekLengthReader) Read(b []byte) (int, error) {
123123
return int(bytesToRead), nil
124124
}
125125

126+
func convertToPtr(val reflect.Value) reflect.Value {
127+
valPtr := reflect.New(val.Type())
128+
valPtr.Elem().Set(val)
129+
return valPtr
130+
}
131+
126132
// NewDecoder constructs a new default Decoder implementation from the given io.Reader.
127133
//
128134
// In this implementation, the value can be any one of the following types:
@@ -377,7 +383,6 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
377383
val = reflect.ValueOf(f)
378384
case tJSONNumber:
379385
val = reflect.ValueOf(strconv.FormatFloat(f, 'f', -1, 64)).Convert(tJSONNumber)
380-
381386
default:
382387
return val, nil
383388
}
@@ -404,24 +409,19 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
404409
return val, nil
405410
}
406411
case 0x4:
407-
postProcess := func(isPtr bool, valueToProcess reflect.Value) reflect.Value {
408-
if !isPtr {
409-
return valueToProcess
410-
}
411-
valPtr := reflect.New(valueToProcess.Type())
412-
valPtr.Elem().Set(valueToProcess)
413-
return valPtr
414-
}
415-
416412
if containerType == tEmpty {
417413
d := newDecoder(bytes.NewBuffer(v.ReaderArray()))
418414
newVal, err := d.decodeBSONArrayToSlice(tEmptySlice)
419415
if err != nil {
420416
return val, err
421417
}
422418

423-
val = postProcess(isPtr, newVal)
424-
isPtr = false
419+
if isPtr {
420+
val = convertToPtr(newVal)
421+
isPtr = false
422+
} else {
423+
val = newVal
424+
}
425425

426426
break
427427
}
@@ -433,8 +433,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
433433
return val, err
434434
}
435435

436-
val = postProcess(isPtr, newVal)
437-
isPtr = false
436+
if isPtr {
437+
val = convertToPtr(newVal)
438+
isPtr = false
439+
} else {
440+
val = newVal
441+
}
438442

439443
break
440444
}
@@ -446,8 +450,12 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
446450
return val, err
447451
}
448452

449-
val = postProcess(isPtr, newVal)
450-
isPtr = false
453+
if isPtr {
454+
val = convertToPtr(newVal)
455+
isPtr = false
456+
} else {
457+
val = newVal
458+
}
451459

452460
break
453461
}
@@ -698,9 +706,7 @@ func (d *decoder) getReflectValue(v *Value, containerType reflect.Type, outer re
698706
}
699707

700708
if isPtr && val.IsValid() && !val.CanAddr() {
701-
valPtr := reflect.New(val.Type())
702-
valPtr.Elem().Set(val)
703-
val = valPtr
709+
val = convertToPtr(val)
704710
}
705711
return val, nil
706712
}

0 commit comments

Comments
 (0)