]> Sergey Matveev's repositories - btrtrc.git/blobdiff - bencode/decode.go
Support marshalling bencode strings into byte arrays
[btrtrc.git] / bencode / decode.go
index 136c92820dba00ea2edb03096bd4998456ba3321..f09ad6f3e375a22d020dfbe82e58b306e13a3096 100644 (file)
@@ -168,26 +168,29 @@ func (d *Decoder) parseString(v reflect.Value) error {
                })
        }
 
+       defer d.buf.Reset()
        switch v.Kind() {
        case reflect.String:
                v.SetString(d.buf.String())
+               return nil
        case reflect.Slice:
                if v.Type().Elem().Kind() != reflect.Uint8 {
-                       panic(&UnmarshalTypeError{
-                               Value: "string",
-                               Type:  v.Type(),
-                       })
+                       break
                }
                v.SetBytes(append([]byte(nil), d.buf.Bytes()...))
-       default:
-               return &UnmarshalTypeError{
-                       Value: "string",
-                       Type:  v.Type(),
+               return nil
+       case reflect.Array:
+               if v.Type().Elem().Kind() != reflect.Uint8 {
+                       break
                }
+               reflect.Copy(v, reflect.ValueOf(d.buf.Bytes()))
+               return nil
+       }
+       // I believe we return here to support "ignore_unmarshal_type_error".
+       return &UnmarshalTypeError{
+               Value: "string",
+               Type:  v.Type(),
        }
-
-       d.buf.Reset()
-       return nil
 }
 
 // Info for parsing a dict value.