18 func (d *decoder) decode(v interface{}) (err error) {
20 if e := recover(); e != nil {
21 if _, ok := e.(runtime.Error); ok {
28 pv := reflect.ValueOf(v)
29 if pv.Kind() != reflect.Ptr || pv.IsNil() {
30 return &UnmarshalInvalidArgError{reflect.TypeOf(v)}
33 d.parse_value(pv.Elem())
37 func check_for_unexpected_eof(err error, offset int64) {
41 what: "unexpected EOF",
46 func (d *decoder) read_byte() byte {
47 b, err := d.ReadByte()
49 check_for_unexpected_eof(err, d.offset)
57 // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
58 // is consumed, but not included into the 'd.buf'
59 func (d *decoder) read_until(sep byte) {
69 func check_for_int_parse_error(err error, offset int64) {
78 // called when 'i' was consumed
79 func (d *decoder) parse_int(v reflect.Value) {
85 what: "empty integer value",
90 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
91 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
92 check_for_int_parse_error(err, start)
95 panic(&UnmarshalTypeError{
96 Value: "integer " + d.buf.String(),
101 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
102 n, err := strconv.ParseUint(d.buf.String(), 10, 64)
103 check_for_int_parse_error(err, start)
105 if v.OverflowUint(n) {
106 panic(&UnmarshalTypeError{
107 Value: "integer " + d.buf.String(),
113 if d.buf.Len() == 1 && d.buf.Bytes()[0] == '0' {
118 panic(&UnmarshalTypeError{
119 Value: "integer " + d.buf.String(),
126 func (d *decoder) parse_string(v reflect.Value) {
127 start := d.offset - 1
129 // read the string length first
131 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
132 check_for_int_parse_error(err, start)
135 n, err := io.CopyN(&d.buf, d, length)
138 check_for_unexpected_eof(err, d.offset)
141 what: "unexpected I/O error: " + err.Error(),
147 v.SetString(d.buf.String())
149 if v.Type().Elem().Kind() != reflect.Uint8 {
150 panic(&UnmarshalTypeError{
155 v.Set(reflect.ValueOf(d.buf.Bytes()))
157 panic(&UnmarshalTypeError{
166 func (d *decoder) parse_dict(v reflect.Value) {
170 if t.Key().Kind() != reflect.String {
171 panic(&UnmarshalTypeError{
177 v.Set(reflect.MakeMap(t))
181 panic(&UnmarshalTypeError{
187 var map_elem reflect.Value
189 // so, at this point 'd' byte was consumed, let's just read key/value
192 var valuev reflect.Value
193 keyv := reflect.ValueOf(&d.key).Elem()
194 if !d.parse_value(keyv) {
198 // get valuev as a map value or as a struct field
201 elem_type := v.Type().Elem()
202 if !map_elem.IsValid() {
203 map_elem = reflect.New(elem_type).Elem()
205 map_elem.Set(reflect.Zero(elem_type))
209 var f reflect.StructField
213 for i, n := 0, t.NumField(); i < n; i++ {
215 tag := f.Tag.Get("bencode")
223 tag_name, _ := parse_tag(tag)
224 if tag_name == d.key {
234 if strings.EqualFold(f.Name, d.key) {
242 panic(&UnmarshalFieldError{
248 valuev = v.FieldByIndex(f.Index)
251 _, ok := d.parse_value_interface()
255 what: "unexpected end of dict, no matching value for a given key",
262 // now we need to actually parse it
263 if !d.parse_value(valuev) {
266 what: "unexpected end of dict, no matching value for a given key",
270 if v.Kind() == reflect.Map {
271 v.SetMapIndex(keyv, valuev)
276 func (d *decoder) parse_list(v reflect.Value) {
278 case reflect.Array, reflect.Slice:
280 panic(&UnmarshalTypeError{
288 if v.Kind() == reflect.Slice && i >= v.Len() {
289 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
294 ok = d.parse_value(v.Index(i))
296 _, ok = d.parse_value_interface()
307 if v.Kind() == reflect.Array {
308 z := reflect.Zero(v.Type().Elem())
309 for n := v.Len(); i < n; i++ {
317 if i == 0 && v.Kind() == reflect.Slice {
318 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
322 func (d *decoder) read_one_value() bool {
323 b, err := d.ReadByte()
337 // read until there is nothing to read
338 for d.read_one_value() {}
339 // consume 'e' as well
344 d.buf.WriteString("e")
346 if b >= '0' && b <= '9' {
347 start := d.buf.Len() - 1
349 length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64)
350 check_for_int_parse_error(err, d.offset - 1)
352 d.buf.WriteString(":")
353 n, err := io.CopyN(&d.buf, d, length)
356 check_for_unexpected_eof(err, d.offset)
359 what: "unexpected I/O error: " + err.Error(),
367 Offset: d.offset - 1,
368 what: "unknown value type (invalid bencode?)",
376 func (d *decoder) parse_unmarshaler(v reflect.Value) bool {
377 m, ok := v.Interface().(Unmarshaler)
379 // T doesn't work, try *T
380 if v.Kind() != reflect.Ptr && v.CanAddr() {
381 m, ok = v.Addr().Interface().(Unmarshaler)
387 if ok && (v.Kind() != reflect.Ptr || !v.IsNil()) {
388 if d.read_one_value() {
389 err := m.UnmarshalBencode(d.buf.Bytes())
392 panic(&UnmarshalerError{v.Type(), err})
402 // returns true if there was a value and it's now stored in 'v', otherwise there
403 // was an end symbol ("e") and no value was stored
404 func (d *decoder) parse_value(v reflect.Value) bool {
405 // we support one level of indirection at the moment
406 if v.Kind() == reflect.Ptr {
407 // if the pointer is nil, allocate a new element of the type it
410 v.Set(reflect.New(v.Type().Elem()))
415 if d.parse_unmarshaler(v) {
419 // common case: interface{}
420 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
421 iface, _ := d.parse_value_interface()
422 v.Set(reflect.ValueOf(iface))
426 b, err := d.ReadByte()
442 if b >= '0' && b <= '9' {
444 // append first digit of the length to the buffer
452 Offset: d.offset - 1,
453 what: "unknown value type (invalid bencode?)",
460 func (d *decoder) parse_value_interface() (interface{}, bool) {
461 b, err := d.ReadByte()
471 return d.parse_dict_interface(), true
473 return d.parse_list_interface(), true
475 return d.parse_int_interface(), true
477 if b >= '0' && b <= '9' {
479 // append first digit of the length to the buffer
481 return d.parse_string_interface(), true
486 Offset: d.offset - 1,
487 what: "unknown value type (invalid bencode?)",
493 func (d *decoder) parse_int_interface() interface{} {
494 start := d.offset - 1
496 if d.buf.Len() == 0 {
499 what: "empty integer value",
503 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
504 check_for_int_parse_error(err, start)
509 func (d *decoder) parse_string_interface() interface{} {
510 start := d.offset - 1
512 // read the string length first
514 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
515 check_for_int_parse_error(err, start)
518 n, err := io.CopyN(&d.buf, d, length)
521 check_for_unexpected_eof(err, d.offset)
524 what: "unexpected I/O error: " + err.Error(),
533 func (d *decoder) parse_dict_interface() interface{} {
534 dict := make(map[string]interface{})
536 keyi, ok := d.parse_value_interface()
541 key, ok := keyi.(string)
545 what: "non-string key in a dict",
549 valuei, ok := d.parse_value_interface()
553 what: "unexpected end of dict, no matching value for a given key",
562 func (d *decoder) parse_list_interface() interface{} {
563 var list []interface{}
565 valuei, ok := d.parse_value_interface()
570 list = append(list, valuei)
573 list = make([]interface{}, 0, 0)