]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Support marshalling bencode strings into byte arrays
authorMatt Joiner <anacrolix@gmail.com>
Wed, 11 Jul 2018 05:22:29 +0000 (15:22 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 11 Jul 2018 05:22:29 +0000 (15:22 +1000)
bencode/decode.go
bencode/decode_test.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.
index 7366102d6baff6e9116907d1ce915e2f826fc2bb..133290443f701cea227fa93e217fa6231d69586a 100644 (file)
@@ -167,3 +167,9 @@ func TestUnmarshalUnusedBytes(t *testing.T) {
        require.EqualValues(t, ErrUnusedTrailingBytes{1}, Unmarshal([]byte("i42ee"), &i))
        assert.EqualValues(t, 42, i)
 }
+
+func TestUnmarshalByteArray(t *testing.T) {
+       var ba [2]byte
+       assert.NoError(t, Unmarshal([]byte("2:hi"), &ba))
+       assert.EqualValues(t, "hi", ba[:])
+}