aboutsummaryrefslogtreecommitdiff
path: root/bencode
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-07-18 01:19:08 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-07-18 01:19:08 +0200
commit59e40ca90dc1a26e1e728bcaec29b061c8b07d87 (patch)
tree2271c72710e08cd3232e6e86d68460bce4e6cde3 /bencode
parente4b008b534de791b10864cbb4cab34fcee471c34 (diff)
Compact/Verbose
Diffstat (limited to 'bencode')
-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)
}