entry.go 1.92 KB
Newer Older
1 2 3 4
package logs

import (
	"fmt"
5
	"io"
6 7 8 9 10 11 12
	"strings"
)

type EntryObj interface {
	encode() Entry
}

13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
const EntrySize = 34

type Entry [EntrySize]byte

func (e Entry) Type() EntryType {
	return EntryType(e[0])
}

type EntryBinary struct{}

func (EntryBinary) Append(dest []byte, e *Entry) []byte {
	return append(dest, e[:]...)
}

func (EntryBinary) ReadAt(dest *Entry, r io.ReaderAt, at int64) (n int, err error) {
	return r.ReadAt(dest[:], at)
}

func (EntryBinary) EntrySize() int {
	return EntrySize
}
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98

type EntryTypeFlag uint8

const (
	FlagSearchCheckpoint EntryTypeFlag = 1 << TypeSearchCheckpoint
	FlagCanonicalHash    EntryTypeFlag = 1 << TypeCanonicalHash
	FlagInitiatingEvent  EntryTypeFlag = 1 << TypeInitiatingEvent
	FlagExecutingLink    EntryTypeFlag = 1 << TypeExecutingLink
	FlagExecutingCheck   EntryTypeFlag = 1 << TypeExecutingCheck
	FlagPadding          EntryTypeFlag = 1 << TypePadding
	// for additional padding
	FlagPadding2 EntryTypeFlag = FlagPadding << 1
)

func (x EntryTypeFlag) String() string {
	var out []string
	for i := EntryTypeFlag(1); i != 0; i <<= 1 { // iterate to bitmask
		if x.Any(i) {
			out = append(out, i.String())
		}
	}
	return strings.Join(out, "|")
}

func (x EntryTypeFlag) Any(v EntryTypeFlag) bool {
	return x&v != 0
}

func (x *EntryTypeFlag) Add(v EntryTypeFlag) {
	*x = *x | v
}

func (x *EntryTypeFlag) Remove(v EntryTypeFlag) {
	*x = *x &^ v
}

type EntryType uint8

const (
	TypeSearchCheckpoint EntryType = iota
	TypeCanonicalHash
	TypeInitiatingEvent
	TypeExecutingLink
	TypeExecutingCheck
	TypePadding
)

func (x EntryType) String() string {
	switch x {
	case TypeSearchCheckpoint:
		return "searchCheckpoint"
	case TypeCanonicalHash:
		return "canonicalHash"
	case TypeInitiatingEvent:
		return "initiatingEvent"
	case TypeExecutingLink:
		return "executingLink"
	case TypeExecutingCheck:
		return "executingCheck"
	case TypePadding:
		return "padding"
	default:
		return fmt.Sprintf("unknown-%d", uint8(x))
	}
}