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
 | 
						|
}
 |