package rrdformat import ( "encoding" "git.lukeshu.com/go/librrd/rrdformat/rrdbinary" ) type RRD struct { Architecture rrdbinary.Architecture Data RRDv0005 } func (rrd *RRD) UnmarshalBinary(data []byte) error { arch, err := SniffArchitecture(data) if err != nil { return err } var header Header if err := rrdbinary.Unmarshal(arch, data, &header); err != nil { return err } var parsed RRDv0005 parsed.DSDefs = make([]DSDef, header.DSCnt) parsed.DSDefs = make([]DSDef, header.DSCnt) parsed.RRADefs = make([]RRADef, header.RRACnt) //LastUpdated parsed.PDPPreps = make([]PDPPrep, header.DSCnt) parsed.CDPPreps = make([]CDPPrep, header.DSCnt*header.RRACnt) parsed.RRAPtrs = make([]RRAPtr, header.RRACnt) //Values switch header.Version { case "0001", "0002": _parsed := &RRDv0001{} //(*RRDv0001)(&parsed) if err := rrdbinary.Unmarshal(arch, data, _parsed); err != nil { return err } case "0003", "0004", "0005": if err := rrdbinary.Unmarshal(arch, data, &parsed); err != nil { return err } default: // version number already validated by // SniffArchitecture panic("should not happen") } val_cnt := 0 for i := range parsed.RRADefs { val_cnt += int(parsed.RRADefs[i].RowCnt * header.DSCnt) } parsed.Values = make([]RRDValue, val_cnt) if err := rrdbinary.Unmarshal(arch, data, &parsed.Values); err != nil { return err } *rrd = RRD{ Architecture: arch, Data: parsed, } return nil } //var _ encoding.BinaryMarshaler = &RRD{} var _ encoding.BinaryUnmarshaler = &RRD{}