Skip to content

Commit 30ce335

Browse files
joeybloggsjoeybloggs
authored andcommitted
initial support for decoding all types
1 parent 509d4bc commit 30ce335

File tree

3 files changed

+307
-49
lines changed

3 files changed

+307
-49
lines changed

decoder.go

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ func (d *decoder) parseMapData() {
137137
}
138138
}
139139

140-
func (d *decoder) traverseStruct(v reflect.Value, namespace []byte) (set bool) {
140+
func (d *decoder) traverseStruct(v reflect.Value, typ reflect.Type, namespace []byte) (set bool) {
141141

142-
typ := v.Type()
142+
// typ := v.Type()
143143
l := len(namespace)
144144
first := l == 0
145145

@@ -195,6 +195,7 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
195195
}
196196
}
197197

198+
// fmt.Println("KIND:", kind)
198199
switch kind {
199200
case reflect.Interface, reflect.Invalid:
200201
return
@@ -464,35 +465,35 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
464465
}
465466

466467
var varr reflect.Value
467-
var existing bool
468+
469+
var ol int
470+
l := len(arr)
468471

469472
if v.IsNil() {
470473
varr = reflect.MakeSlice(v.Type(), len(arr), len(arr))
471-
} else if v.Len() < len(arr) {
472-
if v.Cap() <= len(arr) {
473-
varr = reflect.MakeSlice(v.Type(), len(arr), len(arr))
474+
} else {
475+
476+
ol = v.Len()
477+
l += ol
478+
479+
if v.Cap() <= l {
480+
varr = reflect.MakeSlice(v.Type(), l, l)
474481
} else {
475-
varr = reflect.MakeSlice(v.Type(), len(arr), v.Cap())
482+
// preserve predefined capacity, possibly for reuse after decoding
483+
varr = reflect.MakeSlice(v.Type(), l, v.Cap())
476484
}
477485
reflect.Copy(varr, v)
478-
} else {
479-
existing = true
480-
varr = v
481486
}
482487

483-
for i := 0; i < len(arr); i++ {
488+
for i := ol; i < l; i++ {
484489
newVal := reflect.New(v.Type().Elem()).Elem()
485490

486-
if d.setFieldByType(newVal, namespace, i) {
491+
if d.setFieldByType(newVal, namespace, i-ol) {
487492
set = true
488493
varr.Index(i).Set(newVal)
489494
}
490495
}
491496

492-
if !set || existing {
493-
return
494-
}
495-
496497
v.Set(varr)
497498

498499
case reflect.Map:
@@ -544,8 +545,10 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
544545

545546
case reflect.Struct:
546547

548+
typ := v.Type()
549+
// fmt.Println("Type:", typ)
547550
// if we get here then no custom time function declared so use RFC3339 by default
548-
if v.Type() == timeType {
551+
if typ == timeType {
549552

550553
if !ok || len(arr[idx]) == 0 {
551554
return
@@ -568,7 +571,7 @@ func (d *decoder) setFieldByType(current reflect.Value, namespace []byte, idx in
568571
return
569572
}
570573

571-
set = d.traverseStruct(v, namespace)
574+
set = d.traverseStruct(v, typ, namespace)
572575
}
573576

574577
return

0 commit comments

Comments
 (0)