Files
pttodo/pttodo/ts.go
Bel LaPointe 29bc6a06b4 gr
2025-01-14 21:19:39 -07:00

57 lines
1.0 KiB
Go

package pttodo
import (
"encoding/json"
"errors"
"fmt"
"time"
yaml "gopkg.in/yaml.v2"
)
type TS int64
func (ts TS) time() time.Time {
if ts == 0 {
ts = TS(time.Now().Unix())
}
return time.Unix(int64(ts), 0)
}
func (ts TS) MarshalJSON() ([]byte, error) {
v, err := ts.MarshalYAML()
if err != nil {
return nil, err
}
return json.Marshal(v)
}
func (ts TS) MarshalYAML() (interface{}, error) {
if ts == 0 {
ts = TS(time.Now().Unix())
}
return ts.time().Format(time.UnixDate), nil
}
func (ts *TS) UnmarshalJSON(b []byte) error {
if err := yaml.Unmarshal(b, ts); err != nil {
return fmt.Errorf("faild to unmarshal TS from %q: %w", b, err)
}
return nil
}
func (ts *TS) UnmarshalYAML(unmarshaller func(interface{}) error) error {
var n int64
if err := unmarshaller(&n); err == nil {
*ts = TS(n)
return nil
}
var s string
if err := unmarshaller(&s); err == nil {
t, err := time.ParseInLocation(time.UnixDate, s, time.Local)
*ts = TS(t.Unix())
return err
}
return errors.New("illegal TS")
}