diff --git a/decode.go b/decode.go index 37f3a0b..4005537 100644 --- a/decode.go +++ b/decode.go @@ -7,14 +7,14 @@ import ( "strings" ) -func Unmarshal(data string, v interface{}) error { +func Unmarshal(data string, v interface{}) (string, error) { val := reflect.ValueOf(v) val = reflect.Indirect(val) if !val.CanSet() { - return errors.New("tnetstring: Unmarshal requires a settable value") + return data, errors.New("tnetstring: Unmarshal requires a settable value") } - _, err := unmarshal(data, val) - return err + n, err := unmarshal(data, val) + return data[n:], err } func indirect(v reflect.Value) reflect.Value { diff --git a/tnetstring_test.go b/tnetstring_test.go index 9b688c9..6355cbe 100644 --- a/tnetstring_test.go +++ b/tnetstring_test.go @@ -76,10 +76,13 @@ func TestUnmarshal(t *testing.T) { continue } val := reflect.New(ty) - err := Unmarshal(test.data, val.Interface()) + rest, err := Unmarshal(test.data, val.Interface()) if err != nil { t.Errorf("#%d Unmarshal error: %s", i, err) } + if rest != "" { + t.Errorf("#%d Unmarshal returned non-empty left-over: %v", i, rest) + } if !reflect.DeepEqual(test.val, val.Elem().Interface()) { t.Errorf("#%d want\n%v\ngot\n%v", i, test.val, val.Elem().Interface()) }