diff options
Diffstat (limited to 'rrdformat/rrdbinary/unmarshal.go')
-rw-r--r-- | rrdformat/rrdbinary/unmarshal.go | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/rrdformat/rrdbinary/unmarshal.go b/rrdformat/rrdbinary/unmarshal.go index 1cfee34..142ee9f 100644 --- a/rrdformat/rrdbinary/unmarshal.go +++ b/rrdformat/rrdbinary/unmarshal.go @@ -50,12 +50,14 @@ func (d *unmarshaler) unmarshal(v reflect.Value, tag string) error { return d.unmarshalUnival(v, tag) case reflect.TypeOf(Time(0)): return d.unmarshalTime(v, tag) + case reflect.TypeOf(EOF{}): + return d.unmarshalEOF(v, tag) default: switch v.Type().Kind() { case reflect.Struct: return d.unmarshalStruct(v, tag) - case reflect.Array: - return d.unmarshalArray(v, tag) + case reflect.Array, reflect.Slice: + return d.unmarshalList(v, tag) default: return typeErrorf("invalid type for rrdbinary.Unmarshal: %v", v.Type()) } @@ -83,8 +85,8 @@ func (d *unmarshaler) unmarshalStruct(v reflect.Value, tag string) error { return nil } -func (d *unmarshaler) unmarshalArray(v reflect.Value, tag string) error { - panicUnless(v.Kind() == reflect.Array) +func (d *unmarshaler) unmarshalList(v reflect.Value, tag string) error { + panicUnless(v.Kind() == reflect.Array || v.Kind() == reflect.Slice) panicUnless(v.CanSet()) for i := 0; i < v.Len(); i++ { @@ -314,3 +316,14 @@ func (d *unmarshaler) unmarshalTime(v reflect.Value, tag string) error { d.pos += padding + d.arch.TimeWidth return nil } + +func (d *unmarshaler) unmarshalEOF(v reflect.Value, tag string) error { + panicUnless(v.Type() == reflect.TypeOf(EOF{})) + + data := d.data[d.pos:] + if len(data) > 0 { + return d.binErrorf(16, "extra %d bytes of data after expected end-of-file", len(data)) + } + + return nil +} |