133 lines
2.5 KiB
Go
133 lines
2.5 KiB
Go
package backupds
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
|
|
cbg "github.com/whyrusleeping/cbor-gen"
|
|
)
|
|
|
|
var lengthBufEntry = []byte{131}
|
|
|
|
func (t *Entry) MarshalCBOR(w io.Writer) error {
|
|
if t == nil {
|
|
_, err := w.Write(cbg.CborNull)
|
|
return err
|
|
}
|
|
if _, err := w.Write(lengthBufEntry); err != nil {
|
|
return err
|
|
}
|
|
|
|
scratch := make([]byte, 9)
|
|
|
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Key))); err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err := w.Write(t.Key[:]); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajByteString, uint64(len(t.Value))); err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err := w.Write(t.Value[:]); err != nil {
|
|
return err
|
|
}
|
|
|
|
// t.Timestamp (int64) (int64)
|
|
if t.Timestamp >= 0 {
|
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajUnsignedInt, uint64(t.Timestamp)); err != nil {
|
|
return err
|
|
}
|
|
} else {
|
|
if err := cbg.WriteMajorTypeHeaderBuf(scratch, w, cbg.MajNegativeInt, uint64(-t.Timestamp-1)); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (t *Entry) UnmarshalCBOR(r io.Reader) error {
|
|
*t = Entry{}
|
|
|
|
br := cbg.GetPeeker(r)
|
|
scratch := make([]byte, 8)
|
|
|
|
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if maj != cbg.MajArray {
|
|
return fmt.Errorf("cbor input should be of type array")
|
|
}
|
|
|
|
if extra != 3 {
|
|
return fmt.Errorf("cbor input had wrong number of fields")
|
|
}
|
|
|
|
// t.Key ([]uint8) (slice)
|
|
|
|
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if maj != cbg.MajByteString {
|
|
return fmt.Errorf("expected byte array")
|
|
}
|
|
|
|
if extra > 0 {
|
|
t.Key = make([]uint8, extra)
|
|
}
|
|
|
|
if _, err := io.ReadFull(br, t.Key[:]); err != nil {
|
|
return err
|
|
}
|
|
// t.Value ([]uint8) (slice)
|
|
|
|
maj, extra, err = cbg.CborReadHeaderBuf(br, scratch)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if maj != cbg.MajByteString {
|
|
return fmt.Errorf("expected byte array")
|
|
}
|
|
|
|
if extra > 0 {
|
|
t.Value = make([]uint8, extra)
|
|
}
|
|
|
|
if _, err := io.ReadFull(br, t.Value[:]); err != nil {
|
|
return err
|
|
}
|
|
// t.Timestamp (int64) (int64)
|
|
{
|
|
maj, extra, err := cbg.CborReadHeaderBuf(br, scratch)
|
|
var extraI int64
|
|
if err != nil {
|
|
return err
|
|
}
|
|
switch maj {
|
|
case cbg.MajUnsignedInt:
|
|
extraI = int64(extra)
|
|
if extraI < 0 {
|
|
return fmt.Errorf("int64 positive overflow")
|
|
}
|
|
case cbg.MajNegativeInt:
|
|
extraI = int64(extra)
|
|
if extraI < 0 {
|
|
return fmt.Errorf("int64 negative oveflow")
|
|
}
|
|
extraI = -1 - extraI
|
|
default:
|
|
return fmt.Errorf("wrong type for int64 field: %d", maj)
|
|
}
|
|
|
|
t.Timestamp = extraI
|
|
}
|
|
return nil
|
|
}
|