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