23 func (d *decoder) decode(v interface{}) (err error) {
25 if e := recover(); e != nil {
26 if _, ok := e.(runtime.Error); ok {
33 pv := reflect.ValueOf(v)
34 if pv.Kind() != reflect.Ptr || pv.IsNil() {
35 return &UnmarshalInvalidArgError{reflect.TypeOf(v)}
38 if !d.parse_value(pv.Elem()) {
39 d.throwSyntaxError(d.offset-1, errors.New("unexpected 'e'"))
44 func check_for_unexpected_eof(err error, offset int64) {
48 What: io.ErrUnexpectedEOF,
53 func (d *decoder) read_byte() byte {
54 b, err := d.ReadByte()
56 check_for_unexpected_eof(err, d.offset)
64 // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
65 // is consumed, but not included into the 'd.buf'
66 func (d *decoder) read_until(sep byte) {
76 func check_for_int_parse_error(err error, offset int64) {
85 func (d *decoder) throwSyntaxError(offset int64, err error) {
92 // called when 'i' was consumed
93 func (d *decoder) parse_int(v reflect.Value) {
99 What: errors.New("empty integer value"),
106 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
107 n, err := strconv.ParseInt(s, 10, 64)
108 check_for_int_parse_error(err, start)
110 if v.OverflowInt(n) {
111 panic(&UnmarshalTypeError{
112 Value: "integer " + s,
117 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
118 n, err := strconv.ParseUint(s, 10, 64)
119 check_for_int_parse_error(err, start)
121 if v.OverflowUint(n) {
122 panic(&UnmarshalTypeError{
123 Value: "integer " + s,
131 panic(&UnmarshalTypeError{
132 Value: "integer " + s,
139 func (d *decoder) parse_string(v reflect.Value) {
140 start := d.offset - 1
142 // read the string length first
144 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
145 check_for_int_parse_error(err, start)
148 n, err := io.CopyN(&d.buf, d, length)
151 check_for_unexpected_eof(err, d.offset)
154 What: errors.New("unexpected I/O error: " + err.Error()),
160 v.SetString(d.buf.String())
162 if v.Type().Elem().Kind() != reflect.Uint8 {
163 panic(&UnmarshalTypeError{
168 sl := make([]byte, len(d.buf.Bytes()))
169 copy(sl, d.buf.Bytes())
170 v.Set(reflect.ValueOf(sl))
172 panic(&UnmarshalTypeError{
181 func (d *decoder) parse_dict(v reflect.Value) {
185 if t.Key().Kind() != reflect.String {
186 panic(&UnmarshalTypeError{
192 v.Set(reflect.MakeMap(t))
196 panic(&UnmarshalTypeError{
202 var map_elem reflect.Value
204 // so, at this point 'd' byte was consumed, let's just read key/value
207 var valuev reflect.Value
208 keyv := reflect.ValueOf(&d.key).Elem()
209 if !d.parse_value(keyv) {
213 // get valuev as a map value or as a struct field
216 elem_type := v.Type().Elem()
217 if !map_elem.IsValid() {
218 map_elem = reflect.New(elem_type).Elem()
220 map_elem.Set(reflect.Zero(elem_type))
224 var f reflect.StructField
228 for i, n := 0, t.NumField(); i < n; i++ {
230 tag := f.Tag.Get("bencode")
238 tag_name, _ := parse_tag(tag)
239 if tag_name == d.key {
249 if strings.EqualFold(f.Name, d.key) {
257 panic(&UnmarshalFieldError{
263 valuev = v.FieldByIndex(f.Index)
266 _, ok := d.parse_value_interface()
274 // now we need to actually parse it
275 if !d.parse_value(valuev) {
279 if v.Kind() == reflect.Map {
280 v.SetMapIndex(keyv, valuev)
285 func (d *decoder) parse_list(v reflect.Value) {
287 case reflect.Array, reflect.Slice:
289 panic(&UnmarshalTypeError{
297 if v.Kind() == reflect.Slice && i >= v.Len() {
298 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
303 ok = d.parse_value(v.Index(i))
305 _, ok = d.parse_value_interface()
316 if v.Kind() == reflect.Array {
317 z := reflect.Zero(v.Type().Elem())
318 for n := v.Len(); i < n; i++ {
326 if i == 0 && v.Kind() == reflect.Slice {
327 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
331 func (d *decoder) read_one_value() bool {
332 b, err := d.ReadByte()
346 // read until there is nothing to read
347 for d.read_one_value() {
349 // consume 'e' as well
354 d.buf.WriteString("e")
356 if b >= '0' && b <= '9' {
357 start := d.buf.Len() - 1
359 length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64)
360 check_for_int_parse_error(err, d.offset-1)
362 d.buf.WriteString(":")
363 n, err := io.CopyN(&d.buf, d, length)
366 check_for_unexpected_eof(err, d.offset)
369 What: errors.New("unexpected I/O error: " + err.Error()),
375 d.raiseUnknownValueType(b, d.offset-1)
382 func (d *decoder) parse_unmarshaler(v reflect.Value) bool {
383 m, ok := v.Interface().(Unmarshaler)
385 // T doesn't work, try *T
386 if v.Kind() != reflect.Ptr && v.CanAddr() {
387 m, ok = v.Addr().Interface().(Unmarshaler)
393 if ok && (v.Kind() != reflect.Ptr || !v.IsNil()) {
394 if d.read_one_value() {
395 err := m.UnmarshalBencode(d.buf.Bytes())
398 panic(&UnmarshalerError{v.Type(), err})
408 // Returns true if there was a value and it's now stored in 'v', otherwise
409 // there was an end symbol ("e") and no value was stored.
410 func (d *decoder) parse_value(v reflect.Value) bool {
411 // we support one level of indirection at the moment
412 if v.Kind() == reflect.Ptr {
413 // if the pointer is nil, allocate a new element of the type it
416 v.Set(reflect.New(v.Type().Elem()))
421 if d.parse_unmarshaler(v) {
425 // common case: interface{}
426 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
427 iface, _ := d.parse_value_interface()
428 v.Set(reflect.ValueOf(iface))
432 b, err := d.ReadByte()
448 if b >= '0' && b <= '9' {
450 // append first digit of the length to the buffer
456 d.raiseUnknownValueType(b, d.offset-1)
462 // An unknown bencode type character was encountered.
463 func (d *decoder) raiseUnknownValueType(b byte, offset int64) {
466 What: fmt.Errorf("unknown value type %+q", b),
470 func (d *decoder) parse_value_interface() (interface{}, bool) {
471 b, err := d.ReadByte()
481 return d.parse_dict_interface(), true
483 return d.parse_list_interface(), true
485 return d.parse_int_interface(), true
487 if b >= '0' && b <= '9' {
489 // append first digit of the length to the buffer
491 return d.parse_string_interface(), true
494 d.raiseUnknownValueType(b, d.offset-1)
499 func (d *decoder) parse_int_interface() (ret interface{}) {
500 start := d.offset - 1
502 if d.buf.Len() == 0 {
505 What: errors.New("empty integer value"),
509 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
510 if ne, ok := err.(*strconv.NumError); ok && ne.Err == strconv.ErrRange {
512 _, ok := i.SetString(d.buf.String(), 10)
516 What: errors.New("failed to parse integer"),
521 check_for_int_parse_error(err, start)
529 func (d *decoder) parse_string_interface() interface{} {
530 start := d.offset - 1
532 // read the string length first
534 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
535 check_for_int_parse_error(err, start)
538 n, err := io.CopyN(&d.buf, d, length)
541 check_for_unexpected_eof(err, d.offset)
544 What: errors.New("unexpected I/O error: " + err.Error()),
553 func (d *decoder) parse_dict_interface() interface{} {
554 dict := make(map[string]interface{})
556 keyi, ok := d.parse_value_interface()
561 key, ok := keyi.(string)
565 What: errors.New("non-string key in a dict"),
569 valuei, ok := d.parse_value_interface()
579 func (d *decoder) parse_list_interface() interface{} {
580 var list []interface{}
582 valuei, ok := d.parse_value_interface()
587 list = append(list, valuei)
590 list = make([]interface{}, 0, 0)