From ded9f5352c3995e20af6fb61bc4c138474969657 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 15 Jun 2016 23:40:51 +0200 Subject: Generalize --- bencode/bencode.go | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'bencode/bencode.go') diff --git a/bencode/bencode.go b/bencode/bencode.go index db980f7..0592d5b 100644 --- a/bencode/bencode.go +++ b/bencode/bencode.go @@ -157,6 +157,21 @@ func (d *decodeState) unmarshalField(v reflect.Value) error { return nil } +func findKey(key string, v reflect.Value) reflect.Value { + if v.CanSet() { + t := v.Type() + for i := 0; i < t.NumField(); i++ { + f := t.Field(i) + tag := f.Tag.Get("bencode") + name, _ := parseTag(tag) + if key == name || key == f.Name || key == strings.ToLower(f.Name) { + return v.Field(i) + } + } + } + return reflect.Value{} +} + func (d *decodeState) unmarshalDict(v reflect.Value) { if d.data[d.off] != 'd' { panic("not a dict") @@ -164,34 +179,19 @@ func (d *decodeState) unmarshalDict(v reflect.Value) { d.off++ var infoOff, infoEnd int - for d.data[d.off] != 'e' { key, n := parseString(d.data[d.off:]) d.off += n - var found bool - if v.CanSet() { - t := v.Type() - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - tag := f.Tag.Get("bencode") - name, _ := parseTag(tag) - if key == name || key == f.Name || key == strings.ToLower(f.Name) { - if key == "info" { - infoOff = d.off - } - d.unmarshalField(v.Field(i)) - if key == "info" { - infoEnd = d.off - } - found = true - break - } - } + f := findKey(key, v) + if key == "info" { + infoOff = d.off } - if !found { - d.unmarshalField(reflect.Value{}) + d.unmarshalField(f) + if key == "info" { + infoEnd = d.off } } + if v.CanSet() { if ih := v.FieldByName("InfoHash"); ih.IsValid() && infoEnd > infoOff { sum := sha1.Sum(d.data[infoOff:infoEnd]) -- cgit v1.2.3