This repository has been archived by the owner on Jan 29, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
lit_time.go
79 lines (65 loc) · 2.15 KB
/
lit_time.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
package lit
import (
"time"
"github.com/mb0/xelf/bfr"
"github.com/mb0/xelf/cor"
"github.com/mb0/xelf/typ"
)
type (
Time time.Time
Span time.Duration
)
func (v Time) Typ() typ.Type { return typ.Time }
func (v Span) Typ() typ.Type { return typ.Span }
func (v Time) IsZero() bool { return v == ZeroTime }
func (v Span) IsZero() bool { return v == ZeroSpan }
func (v Time) Num() float64 { return float64(cor.UnixMilli(time.Time(v))) }
func (v Span) Num() float64 { return float64(cor.Milli(time.Duration(v))) }
func (v Time) Char() string { return cor.FormatTime(time.Time(v)) }
func (v Span) Char() string { return cor.FormatSpan(time.Duration(v)) }
func (v Time) Val() interface{} { return time.Time(v) }
func (v Span) Val() interface{} { return time.Duration(v) }
func (v Time) String() string { return sglQuoteString(v.Char()) }
func (v Span) String() string { return sglQuoteString(v.Char()) }
func (v Time) MarshalJSON() ([]byte, error) { return dblQuoteBytes(v.Char()) }
func (v Span) MarshalJSON() ([]byte, error) { return dblQuoteBytes(v.Char()) }
func (v *Span) UnmarshalText(b []byte) error {
s, err := cor.ParseSpan(string(b))
*v = Span(s)
return err
}
func (v Time) WriteBfr(b *bfr.Ctx) error { return b.Quote(v.Char()) }
func (v Span) WriteBfr(b *bfr.Ctx) error { return b.Quote(v.Char()) }
func (v Span) Seconds() float64 {
return time.Duration(v).Seconds()
}
func (v *Time) New() Proxy { return new(Time) }
func (v *Time) Ptr() interface{} { return v }
func (v *Time) Assign(l Lit) error {
l = Deopt(l)
if b, ok := l.(Character); ok {
if e, ok := b.Val().(time.Time); ok {
*v = Time(e)
return nil
}
} else if v.Typ().Equal(l.Typ()) { // leaves null
*v = ZeroTime
return nil
}
return cor.Errorf("%q not assignable to %q", l.Typ(), v.Typ())
}
func (v *Span) New() Proxy { return new(Span) }
func (v *Span) Ptr() interface{} { return v }
func (v *Span) Assign(l Lit) error {
l = Deopt(l)
if b, ok := l.(Character); ok {
if e, ok := b.Val().(time.Duration); ok {
*v = Span(e)
return nil
}
} else if v.Typ().Equal(l.Typ()) { // leaves null
*v = 0
return nil
}
return cor.Errorf("%q not assignable to %q", l.Typ(), v.Typ())
}