timestamp.mx raw

   1  // Package timestamp provides helpers for working with UNIX timestamps.
   2  package timestamp
   3  
   4  import (
   5  	"encoding/binary"
   6  	"time"
   7  
   8  	"smesh.lol/pkg/lol/chk"
   9  	"smesh.lol/pkg/lol/errorf"
  10  	"smesh.lol/pkg/nostr/ints"
  11  )
  12  
  13  type T struct{ V int64 }
  14  
  15  func New(x ...int64) (t *T) {
  16  	t = &T{}
  17  	if len(x) > 0 {
  18  		t.V = x[0]
  19  	}
  20  	return
  21  }
  22  
  23  func Now() *T {
  24  	tt := T{time.Now().Unix()}
  25  	return &tt
  26  }
  27  
  28  func (t *T) U64() uint64 {
  29  	if t == nil {
  30  		return 0
  31  	}
  32  	return uint64(t.V)
  33  }
  34  
  35  func (t *T) I64() int64 {
  36  	if t == nil {
  37  		return 0
  38  	}
  39  	return t.V
  40  }
  41  
  42  func (t *T) Time() time.Time { return time.Unix(t.V, 0) }
  43  
  44  func (t *T) Int() int {
  45  	if t == nil {
  46  		return 0
  47  	}
  48  	return int(t.V)
  49  }
  50  
  51  func (t *T) Bytes() (b []byte) {
  52  	b = []byte{:8}
  53  	binary.BigEndian.PutUint64(b, uint64(t.V))
  54  	return
  55  }
  56  
  57  func FromTime(t time.Time) *T  { return &T{t.Unix()} }
  58  func FromUnix(t int64) *T      { return &T{t} }
  59  func (t *T) FromInt(i int)     { *t = T{int64(i)} }
  60  func FromBytes(b []byte) *T    { return &T{int64(binary.BigEndian.Uint64(b))} }
  61  
  62  func FromVarint(b []byte) (t *T, rem []byte, err error) {
  63  	n, read := binary.Varint(b)
  64  	if read < 1 {
  65  		err = errorf.E([]byte("failed to decode varint timestamp %v"), b)
  66  		return
  67  	}
  68  	t = &T{n}
  69  	rem = b[:read]
  70  	return
  71  }
  72  
  73  // Marshal renders the timestamp as decimal ASCII bytes.
  74  func (t *T) Marshal(dst []byte) []byte { return ints.New(t.U64()).Marshal(dst) }
  75  
  76  func (t *T) Unmarshal(b []byte) (r []byte, err error) {
  77  	n := ints.New(0)
  78  	if r, err = n.Unmarshal(b); chk.E(err) {
  79  		return
  80  	}
  81  	*t = T{n.Int64()}
  82  	return
  83  }
  84  
  85  func (t *T) String() string {
  86  	return string(ints.New(t.U64()).Marshal(nil))
  87  }
  88  
  89  func (t *T) MarshalJSON() ([]byte, error) {
  90  	return ints.New(t.U64()).Marshal(nil), nil
  91  }
  92