21 func (d *decoder) decode(v interface{}) (err error) {
23 if e := recover(); e != nil {
24 if _, ok := e.(runtime.Error); ok {
31 pv := reflect.ValueOf(v)
32 if pv.Kind() != reflect.Ptr || pv.IsNil() {
33 return &UnmarshalInvalidArgError{reflect.TypeOf(v)}
36 d.parse_value(pv.Elem())
40 func check_for_unexpected_eof(err error, offset int64) {
44 What: io.ErrUnexpectedEOF,
49 func (d *decoder) read_byte() byte {
50 b, err := d.ReadByte()
52 check_for_unexpected_eof(err, d.offset)
60 // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
61 // is consumed, but not included into the 'd.buf'
62 func (d *decoder) read_until(sep byte) {
72 func check_for_int_parse_error(err error, offset int64) {
81 // called when 'i' was consumed
82 func (d *decoder) parse_int(v reflect.Value) {
88 What: errors.New("empty integer value"),
93 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
94 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
95 check_for_int_parse_error(err, start)
98 panic(&UnmarshalTypeError{
99 Value: "integer " + d.buf.String(),
104 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
105 n, err := strconv.ParseUint(d.buf.String(), 10, 64)
106 check_for_int_parse_error(err, start)
108 if v.OverflowUint(n) {
109 panic(&UnmarshalTypeError{
110 Value: "integer " + d.buf.String(),
116 v.SetBool(d.buf.String() != "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: errors.New("unexpected I/O error: " + err.Error()),
147 v.SetString(d.buf.String())
149 if v.Type().Elem().Kind() != reflect.Uint8 {
150 panic(&UnmarshalTypeError{
155 sl := make([]byte, len(d.buf.Bytes()))
156 copy(sl, d.buf.Bytes())
157 v.Set(reflect.ValueOf(sl))
159 panic(&UnmarshalTypeError{
168 func (d *decoder) parse_dict(v reflect.Value) {
172 if t.Key().Kind() != reflect.String {
173 panic(&UnmarshalTypeError{
179 v.Set(reflect.MakeMap(t))
183 panic(&UnmarshalTypeError{
189 var map_elem reflect.Value
191 // so, at this point 'd' byte was consumed, let's just read key/value
194 var valuev reflect.Value
195 keyv := reflect.ValueOf(&d.key).Elem()
196 if !d.parse_value(keyv) {
200 // get valuev as a map value or as a struct field
203 elem_type := v.Type().Elem()
204 if !map_elem.IsValid() {
205 map_elem = reflect.New(elem_type).Elem()
207 map_elem.Set(reflect.Zero(elem_type))
211 var f reflect.StructField
215 for i, n := 0, t.NumField(); i < n; i++ {
217 tag := f.Tag.Get("bencode")
225 tag_name, _ := parse_tag(tag)
226 if tag_name == d.key {
236 if strings.EqualFold(f.Name, d.key) {
244 panic(&UnmarshalFieldError{
250 valuev = v.FieldByIndex(f.Index)
253 _, ok := d.parse_value_interface()
257 What: errors.New("unexpected end of dict, no matching value for a given key"),
264 // now we need to actually parse it
265 if !d.parse_value(valuev) {
268 What: errors.New("unexpected end of dict, no matching value for a given key"),
272 if v.Kind() == reflect.Map {
273 v.SetMapIndex(keyv, valuev)
278 func (d *decoder) parse_list(v reflect.Value) {
280 case reflect.Array, reflect.Slice:
282 panic(&UnmarshalTypeError{
290 if v.Kind() == reflect.Slice && i >= v.Len() {
291 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
296 ok = d.parse_value(v.Index(i))
298 _, ok = d.parse_value_interface()
309 if v.Kind() == reflect.Array {
310 z := reflect.Zero(v.Type().Elem())
311 for n := v.Len(); i < n; i++ {
319 if i == 0 && v.Kind() == reflect.Slice {
320 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
324 func (d *decoder) read_one_value() bool {
325 b, err := d.ReadByte()
339 // read until there is nothing to read
340 for d.read_one_value() {
342 // consume 'e' as well
347 d.buf.WriteString("e")
349 if b >= '0' && b <= '9' {
350 start := d.buf.Len() - 1
352 length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64)
353 check_for_int_parse_error(err, d.offset-1)
355 d.buf.WriteString(":")
356 n, err := io.CopyN(&d.buf, d, length)
359 check_for_unexpected_eof(err, d.offset)
362 What: errors.New("unexpected I/O error: " + err.Error()),
370 Offset: d.offset - 1,
371 What: errors.New("unknown value type (invalid bencode?)"),
379 func (d *decoder) parse_unmarshaler(v reflect.Value) bool {
380 m, ok := v.Interface().(Unmarshaler)
382 // T doesn't work, try *T
383 if v.Kind() != reflect.Ptr && v.CanAddr() {
384 m, ok = v.Addr().Interface().(Unmarshaler)
390 if ok && (v.Kind() != reflect.Ptr || !v.IsNil()) {
391 if d.read_one_value() {
392 err := m.UnmarshalBencode(d.buf.Bytes())
395 panic(&UnmarshalerError{v.Type(), err})
405 // returns true if there was a value and it's now stored in 'v', otherwise there
406 // was an end symbol ("e") and no value was stored
407 func (d *decoder) parse_value(v reflect.Value) bool {
408 // we support one level of indirection at the moment
409 if v.Kind() == reflect.Ptr {
410 // if the pointer is nil, allocate a new element of the type it
413 v.Set(reflect.New(v.Type().Elem()))
418 if d.parse_unmarshaler(v) {
422 // common case: interface{}
423 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
424 iface, _ := d.parse_value_interface()
425 v.Set(reflect.ValueOf(iface))
429 b, err := d.ReadByte()
445 if b >= '0' && b <= '9' {
447 // append first digit of the length to the buffer
455 Offset: d.offset - 1,
456 What: errors.New("unknown value type (invalid bencode?)"),
463 func (d *decoder) parse_value_interface() (interface{}, bool) {
464 b, err := d.ReadByte()
474 return d.parse_dict_interface(), true
476 return d.parse_list_interface(), true
478 return d.parse_int_interface(), true
480 if b >= '0' && b <= '9' {
482 // append first digit of the length to the buffer
484 return d.parse_string_interface(), true
489 Offset: d.offset - 1,
490 What: errors.New("unknown value type (invalid bencode?)"),
495 func (d *decoder) parse_int_interface() interface{} {
496 start := d.offset - 1
498 if d.buf.Len() == 0 {
501 What: errors.New("empty integer value"),
505 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
506 check_for_int_parse_error(err, start)
511 func (d *decoder) parse_string_interface() interface{} {
512 start := d.offset - 1
514 // read the string length first
516 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
517 check_for_int_parse_error(err, start)
520 n, err := io.CopyN(&d.buf, d, length)
523 check_for_unexpected_eof(err, d.offset)
526 What: errors.New("unexpected I/O error: " + err.Error()),
535 func (d *decoder) parse_dict_interface() interface{} {
536 dict := make(map[string]interface{})
538 keyi, ok := d.parse_value_interface()
543 key, ok := keyi.(string)
547 What: errors.New("non-string key in a dict"),
551 valuei, ok := d.parse_value_interface()
555 What: errors.New("unexpected end of dict, no matching value for a given key"),
564 func (d *decoder) parse_list_interface() interface{} {
565 var list []interface{}
567 valuei, ok := d.parse_value_interface()
572 list = append(list, valuei)
575 list = make([]interface{}, 0, 0)