18 func (d *decoder) decode(v interface{}) (err error) {
22 if e := recover(); e != nil {
23 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: "unexpected EOF",
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: "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 if d.buf.Len() == 1 && d.buf.Bytes()[0] == '0' {
121 panic(&UnmarshalTypeError{
122 Value: "integer " + d.buf.String(),
129 func (d *decoder) parse_string(v reflect.Value) {
130 start := d.offset - 1
132 // read the string length first
134 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
135 check_for_int_parse_error(err, start)
138 n, err := io.CopyN(&d.buf, d, length)
141 check_for_unexpected_eof(err, d.offset)
144 what: "unexpected I/O error: " + err.Error(),
150 v.SetString(d.buf.String())
152 if v.Type().Elem().Kind() != reflect.Uint8 {
153 panic(&UnmarshalTypeError{
158 v.Set(reflect.ValueOf(d.buf.Bytes()))
160 panic(&UnmarshalTypeError{
169 func (d *decoder) parse_dict(v reflect.Value) {
173 if t.Key().Kind() != reflect.String {
174 panic(&UnmarshalTypeError{
180 v.Set(reflect.MakeMap(t))
184 panic(&UnmarshalTypeError{
190 var map_elem reflect.Value
192 // so, at this point 'd' byte was consumed, let's just read key/value
195 var valuev reflect.Value
196 keyv := reflect.ValueOf(&d.key).Elem()
197 if !d.parse_value(keyv) {
201 // get valuev as a map value or as a struct field
204 elem_type := v.Type().Elem()
205 if !map_elem.IsValid() {
206 map_elem = reflect.New(elem_type).Elem()
208 map_elem.Set(reflect.Zero(elem_type))
212 var f reflect.StructField
216 for i, n := 0, t.NumField(); i < n; i++ {
218 tag := f.Tag.Get("bencode")
226 tag_name, _ := parse_tag(tag)
227 if tag_name == d.key {
237 if strings.EqualFold(f.Name, d.key) {
245 panic(&UnmarshalFieldError{
251 valuev = v.FieldByIndex(f.Index)
254 _, ok := d.parse_value_interface()
258 what: "unexpected end of dict, no matching value for a given key",
265 // now we need to actually parse it
266 if !d.parse_value(valuev) {
269 what: "unexpected end of dict, no matching value for a given key",
273 if v.Kind() == reflect.Map {
274 v.SetMapIndex(keyv, valuev)
279 func (d *decoder) parse_list(v reflect.Value) {
281 case reflect.Array, reflect.Slice:
283 panic(&UnmarshalTypeError{
291 if v.Kind() == reflect.Slice && i >= v.Len() {
292 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
297 ok = d.parse_value(v.Index(i))
299 _, ok = d.parse_value_interface()
310 if v.Kind() == reflect.Array {
311 z := reflect.Zero(v.Type().Elem())
312 for n := v.Len(); i < n; i++ {
320 if i == 0 && v.Kind() == reflect.Slice {
321 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
325 // returns true if there was a value and it's now stored in 'v', otherwise there
326 // was an end symbol ("e") and no value was stored
327 func (d *decoder) parse_value(v reflect.Value) bool {
328 if pv := v; pv.Kind() == reflect.Ptr {
329 // if the pointer is nil, allocate a new element of the type it
332 pv.Set(reflect.New(pv.Type().Elem()))
338 if v.Kind() == reflect.Interface {
339 iface, _ := d.parse_value_interface()
340 v.Set(reflect.ValueOf(iface))
344 b, err := d.ReadByte()
360 if b >= '0' && b <= '9' {
362 // append first digit of the length to the buffer
370 Offset: d.offset - 1,
371 what: "unknown value type (invalid bencode?)",
378 func (d *decoder) parse_value_interface() (interface{}, bool) {
379 b, err := d.ReadByte()
389 return d.parse_dict_interface(), true
391 return d.parse_list_interface(), true
393 return d.parse_int_interface(), true
395 if b >= '0' && b <= '9' {
397 // append first digit of the length to the buffer
399 return d.parse_string_interface(), true
404 Offset: d.offset - 1,
405 what: "unknown value type (invalid bencode?)",
411 func (d *decoder) parse_int_interface() interface{} {
412 start := d.offset - 1
414 if d.buf.Len() == 0 {
417 what: "empty integer value",
421 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
422 check_for_int_parse_error(err, start)
427 func (d *decoder) parse_string_interface() interface{} {
428 start := d.offset - 1
430 // read the string length first
432 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
433 check_for_int_parse_error(err, start)
436 n, err := io.CopyN(&d.buf, d, length)
439 check_for_unexpected_eof(err, d.offset)
442 what: "unexpected I/O error: " + err.Error(),
451 func (d *decoder) parse_dict_interface() interface{} {
452 dict := make(map[string]interface{})
454 keyi, ok := d.parse_value_interface()
459 key, ok := keyi.(string)
463 what: "non-string key in a dict",
467 valuei, ok := d.parse_value_interface()
471 what: "unexpected end of dict, no matching value for a given key",
480 func (d *decoder) parse_list_interface() interface{} {
481 var list []interface{}
483 valuei, ok := d.parse_value_interface()
488 list = append(list, valuei)