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 if !d.parse_value(pv.Elem()) {
37 d.throwSyntaxError(d.offset-1, errors.New("unexpected 'e'"))
42 func check_for_unexpected_eof(err error, offset int64) {
46 What: io.ErrUnexpectedEOF,
51 func (d *decoder) read_byte() byte {
52 b, err := d.ReadByte()
54 check_for_unexpected_eof(err, d.offset)
62 // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
63 // is consumed, but not included into the 'd.buf'
64 func (d *decoder) read_until(sep byte) {
74 func check_for_int_parse_error(err error, offset int64) {
83 func (d *decoder) throwSyntaxError(offset int64, err error) {
90 // called when 'i' was consumed
91 func (d *decoder) parse_int(v reflect.Value) {
97 What: errors.New("empty integer value"),
102 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
103 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
104 check_for_int_parse_error(err, start)
106 if v.OverflowInt(n) {
107 panic(&UnmarshalTypeError{
108 Value: "integer " + d.buf.String(),
113 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
114 n, err := strconv.ParseUint(d.buf.String(), 10, 64)
115 check_for_int_parse_error(err, start)
117 if v.OverflowUint(n) {
118 panic(&UnmarshalTypeError{
119 Value: "integer " + d.buf.String(),
125 v.SetBool(d.buf.String() != "0")
127 panic(&UnmarshalTypeError{
128 Value: "integer " + d.buf.String(),
135 func (d *decoder) parse_string(v reflect.Value) {
136 start := d.offset - 1
138 // read the string length first
140 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
141 check_for_int_parse_error(err, start)
144 n, err := io.CopyN(&d.buf, d, length)
147 check_for_unexpected_eof(err, d.offset)
150 What: errors.New("unexpected I/O error: " + err.Error()),
156 v.SetString(d.buf.String())
158 if v.Type().Elem().Kind() != reflect.Uint8 {
159 panic(&UnmarshalTypeError{
164 sl := make([]byte, len(d.buf.Bytes()))
165 copy(sl, d.buf.Bytes())
166 v.Set(reflect.ValueOf(sl))
168 panic(&UnmarshalTypeError{
177 func (d *decoder) parse_dict(v reflect.Value) {
181 if t.Key().Kind() != reflect.String {
182 panic(&UnmarshalTypeError{
188 v.Set(reflect.MakeMap(t))
192 panic(&UnmarshalTypeError{
198 var map_elem reflect.Value
200 // so, at this point 'd' byte was consumed, let's just read key/value
203 var valuev reflect.Value
204 keyv := reflect.ValueOf(&d.key).Elem()
205 if !d.parse_value(keyv) {
209 // get valuev as a map value or as a struct field
212 elem_type := v.Type().Elem()
213 if !map_elem.IsValid() {
214 map_elem = reflect.New(elem_type).Elem()
216 map_elem.Set(reflect.Zero(elem_type))
220 var f reflect.StructField
224 for i, n := 0, t.NumField(); i < n; i++ {
226 tag := f.Tag.Get("bencode")
234 tag_name, _ := parse_tag(tag)
235 if tag_name == d.key {
245 if strings.EqualFold(f.Name, d.key) {
253 panic(&UnmarshalFieldError{
259 valuev = v.FieldByIndex(f.Index)
262 _, ok := d.parse_value_interface()
266 What: errors.New("unexpected end of dict, no matching value for a given key"),
273 // now we need to actually parse it
274 if !d.parse_value(valuev) {
277 What: errors.New("unexpected end of dict, no matching value for a given key"),
281 if v.Kind() == reflect.Map {
282 v.SetMapIndex(keyv, valuev)
287 func (d *decoder) parse_list(v reflect.Value) {
289 case reflect.Array, reflect.Slice:
291 panic(&UnmarshalTypeError{
299 if v.Kind() == reflect.Slice && i >= v.Len() {
300 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
305 ok = d.parse_value(v.Index(i))
307 _, ok = d.parse_value_interface()
318 if v.Kind() == reflect.Array {
319 z := reflect.Zero(v.Type().Elem())
320 for n := v.Len(); i < n; i++ {
328 if i == 0 && v.Kind() == reflect.Slice {
329 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
333 func (d *decoder) read_one_value() bool {
334 b, err := d.ReadByte()
348 // read until there is nothing to read
349 for d.read_one_value() {
351 // consume 'e' as well
356 d.buf.WriteString("e")
358 if b >= '0' && b <= '9' {
359 start := d.buf.Len() - 1
361 length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64)
362 check_for_int_parse_error(err, d.offset-1)
364 d.buf.WriteString(":")
365 n, err := io.CopyN(&d.buf, d, length)
368 check_for_unexpected_eof(err, d.offset)
371 What: errors.New("unexpected I/O error: " + err.Error()),
379 Offset: d.offset - 1,
380 What: errors.New("unknown value type (invalid bencode?)"),
388 func (d *decoder) parse_unmarshaler(v reflect.Value) bool {
389 m, ok := v.Interface().(Unmarshaler)
391 // T doesn't work, try *T
392 if v.Kind() != reflect.Ptr && v.CanAddr() {
393 m, ok = v.Addr().Interface().(Unmarshaler)
399 if ok && (v.Kind() != reflect.Ptr || !v.IsNil()) {
400 if d.read_one_value() {
401 err := m.UnmarshalBencode(d.buf.Bytes())
404 panic(&UnmarshalerError{v.Type(), err})
414 // returns true if there was a value and it's now stored in 'v', otherwise there
415 // was an end symbol ("e") and no value was stored
416 func (d *decoder) parse_value(v reflect.Value) bool {
417 // we support one level of indirection at the moment
418 if v.Kind() == reflect.Ptr {
419 // if the pointer is nil, allocate a new element of the type it
422 v.Set(reflect.New(v.Type().Elem()))
427 if d.parse_unmarshaler(v) {
431 // common case: interface{}
432 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
433 iface, _ := d.parse_value_interface()
434 v.Set(reflect.ValueOf(iface))
438 b, err := d.ReadByte()
454 if b >= '0' && b <= '9' {
456 // append first digit of the length to the buffer
464 Offset: d.offset - 1,
465 What: errors.New("unknown value type (invalid bencode?)"),
472 func (d *decoder) parse_value_interface() (interface{}, bool) {
473 b, err := d.ReadByte()
483 return d.parse_dict_interface(), true
485 return d.parse_list_interface(), true
487 return d.parse_int_interface(), true
489 if b >= '0' && b <= '9' {
491 // append first digit of the length to the buffer
493 return d.parse_string_interface(), true
498 Offset: d.offset - 1,
499 What: errors.New("unknown value type (invalid bencode?)"),
504 func (d *decoder) parse_int_interface() interface{} {
505 start := d.offset - 1
507 if d.buf.Len() == 0 {
510 What: errors.New("empty integer value"),
514 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
515 check_for_int_parse_error(err, start)
520 func (d *decoder) parse_string_interface() interface{} {
521 start := d.offset - 1
523 // read the string length first
525 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
526 check_for_int_parse_error(err, start)
529 n, err := io.CopyN(&d.buf, d, length)
532 check_for_unexpected_eof(err, d.offset)
535 What: errors.New("unexpected I/O error: " + err.Error()),
544 func (d *decoder) parse_dict_interface() interface{} {
545 dict := make(map[string]interface{})
547 keyi, ok := d.parse_value_interface()
552 key, ok := keyi.(string)
556 What: errors.New("non-string key in a dict"),
560 valuei, ok := d.parse_value_interface()
564 What: errors.New("unexpected end of dict, no matching value for a given key"),
573 func (d *decoder) parse_list_interface() interface{} {
574 var list []interface{}
576 valuei, ok := d.parse_value_interface()
581 list = append(list, valuei)
584 list = make([]interface{}, 0, 0)