Files
indra/pkg/wire/delay/delay.go

50 lines
1.2 KiB
Go

package delay
import (
"time"
"github.com/indra-labs/indra"
log2 "github.com/indra-labs/indra/pkg/proc/log"
"github.com/indra-labs/indra/pkg/types"
"github.com/indra-labs/indra/pkg/util/slice"
"github.com/indra-labs/indra/pkg/wire/magicbytes"
)
const (
MagicString = "dl"
Len = magicbytes.Len + slice.Uint64Len
)
var (
log = log2.GetLogger(indra.PathBase)
check = log.E.Chk
Magic = slice.Bytes(MagicString)
_ types.Onion = &OnionSkin{}
)
// A OnionSkin is a 32 byte value.
type OnionSkin struct {
time.Duration
types.Onion
}
func (x *OnionSkin) Inner() types.Onion { return nil }
func (x *OnionSkin) Insert(_ types.Onion) {}
func (x *OnionSkin) Len() int { return Len }
func (x *OnionSkin) Encode(b slice.Bytes, c *slice.Cursor) {
copy(b[*c:c.Inc(magicbytes.Len)], Magic)
slice.EncodeUint64(b[*c:c.Inc(slice.Uint64Len)], uint64(x.Duration))
x.Onion.Encode(b, c)
}
func (x *OnionSkin) Decode(b slice.Bytes, c *slice.Cursor) (e error) {
if len(b[*c:]) < Len-magicbytes.Len {
return magicbytes.TooShort(len(b[*c:]), Len-magicbytes.Len,
string(Magic))
}
x.Duration = time.Duration(
slice.DecodeUint64(b[*c:c.Inc(slice.Uint64Len)]))
return
}