package storage import ( "encoding/json" "errors" "github.com/google/uuid" "time" ) type Link struct { Id uuid.UUID Target string OpensFrom time.Time OpensLeft int } var Null = uuid.UUID{} func (l Link) Save(storage Storage[Link, uuid.UUID]) (uuid.UUID, error) { return storage.Save(l) } func (l Link) Serialize() ([]byte, error) { return json.Marshal(l) } func (l Link) Use() error { if e := l.Valid(); e != nil { return e } remaining := l.OpensLeft - 1 if remaining < 1 { _ = Current.Delete(l) return nil } n := Link{ Id: l.Id, Target: l.Target, OpensFrom: l.OpensFrom, OpensLeft: remaining, } return n.Update(Current) } func (l Link) Update(storage Storage[Link, uuid.UUID]) error { return storage.Update(l) } var NoOpensError = errors.New("no opens left") var NotYetOpenError = errors.New("not yet open") func (l Link) Valid() error { if l.OpensLeft < 1 { return NoOpensError } if time.Now().Before(l.OpensFrom) { return NotYetOpenError } return nil } func (l Link) MinutesLeft() int { return int(l.OpensFrom.Sub(time.Now()).Minutes()) }