From 047cdbae0d95dbef453c17aec7d48d6ef7b79cc9 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 24 May 2021 17:31:52 +1000 Subject: [PATCH] bencode: Improve support for embedded structs --- bencode/decode.go | 11 ++++++++--- bencode/encode.go | 16 ++++++++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/bencode/decode.go b/bencode/decode.go index e891f5be..43bb9ce6 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -253,14 +253,19 @@ func parseStructFields(struct_ reflect.Type, each func(key string, df dictField) i := _i f := struct_.Field(i) if f.Anonymous { - parseStructFields(f.Type.Elem(), func(key string, df dictField) { + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + parseStructFields(t, func(key string, df dictField) { innerGet := df.Get df.Get = func(value reflect.Value) func(reflect.Value) { anonPtr := value.Field(i) - if anonPtr.IsNil() { + if anonPtr.Kind() == reflect.Ptr && anonPtr.IsNil() { anonPtr.Set(reflect.New(f.Type.Elem())) + anonPtr = anonPtr.Elem() } - return innerGet(anonPtr.Elem()) + return innerGet(anonPtr) } each(key, df) }) diff --git a/bencode/encode.go b/bencode/encode.go index f25cfef8..05153a8c 100644 --- a/bencode/encode.go +++ b/bencode/encode.go @@ -231,16 +231,24 @@ func makeEncodeFields(t reflect.Type) (fs []encodeField) { continue } if f.Anonymous { - anonEFs := makeEncodeFields(f.Type.Elem()) + t := f.Type + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + anonEFs := makeEncodeFields(t) for aefi := range anonEFs { anonEF := anonEFs[aefi] bottomField := anonEF bottomField.i = func(v reflect.Value) reflect.Value { v = v.Field(i) - if v.IsNil() { - return reflect.Value{} + if v.Kind() == reflect.Ptr { + if v.IsNil() { + // This will skip serializing this value. + return reflect.Value{} + } + v = v.Elem() } - return anonEF.i(v.Elem()) + return anonEF.i(v) } fs = append(fs, bottomField) }