aboutsummaryrefslogtreecommitdiff
path: root/bencode/bdecode.go
diff options
context:
space:
mode:
Diffstat (limited to 'bencode/bdecode.go')
-rw-r--r--bencode/bdecode.go22
1 files changed, 12 insertions, 10 deletions
diff --git a/bencode/bdecode.go b/bencode/bdecode.go
index 837dbec..bda3dd7 100644
--- a/bencode/bdecode.go
+++ b/bencode/bdecode.go
@@ -9,7 +9,7 @@ import (
)
type Unmarshaler interface {
- UnmarshalBencode([]byte) error
+ UnmarshalBencode([]byte) (int, error)
}
var ErrValue = errors.New("Unexpected value")
@@ -19,14 +19,14 @@ type decodeState struct {
off int
}
-func Unmarshal(data []byte, v interface{}) error {
+func Unmarshal(data []byte, v interface{}) (int, error) {
val := reflect.ValueOf(v)
if val.Kind() != reflect.Ptr {
- return errors.New("non-pointer passed to Unmarshal")
+ return 0, errors.New("non-pointer passed to Unmarshal")
}
d := decodeState{data: data}
err := d.unmarshalField(val.Elem())
- return err
+ return d.off, err
}
func (d *decodeState) unmarshalField(v reflect.Value) error {
@@ -57,14 +57,16 @@ func (d *decodeState) unmarshalDict(v reflect.Value) error {
key, n := parseString(d.data[d.off:])
d.off += n
val := findKey(key, v)
- /*
- if val.CanAddr() && val.Addr().Type().NumMethod() > 0 {
- if u, ok := val.Addr().Interface().(Unmarshaler); ok {
- u.UnmarshalBencode(d.data[d.off:])
- log.Println("has unmarshaler", u)
+ if val.CanAddr() && val.Addr().Type().NumMethod() > 0 {
+ if u, ok := val.Addr().Interface().(Unmarshaler); ok {
+ n, err := u.UnmarshalBencode(d.data[d.off:])
+ if err != nil {
+ return err
}
+ d.off += n
+ continue
}
- */
+ }
d.unmarshalField(val)
}