From: Matt Joiner Date: Wed, 11 Jul 2018 05:22:29 +0000 (+1000) Subject: Support marshalling bencode strings into byte arrays X-Git-Tag: v1.0.0~90 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=04fa1b8d4cdbdb745616152a338b5c5b433d5f33;p=btrtrc.git Support marshalling bencode strings into byte arrays --- diff --git a/bencode/decode.go b/bencode/decode.go index 136c9282..f09ad6f3 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -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. diff --git a/bencode/decode_test.go b/bencode/decode_test.go index 7366102d..13329044 100644 --- a/bencode/decode_test.go +++ b/bencode/decode_test.go @@ -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[:]) +}