schedule works! 🎉🔥

This commit is contained in:
Sam Lewis
2022-10-15 22:22:59 -04:00
parent e476a06aca
commit 2d77c4b657
8 changed files with 186 additions and 41 deletions

View File

@@ -90,13 +90,17 @@ type schedule struct {
*/
offset time.Duration
/*
This will be set rather than returning an error to avoid checking err for nil on every schedule :)
err will be set rather than returning an error to avoid checking err for nil on every schedule :)
RegisterSchedule will exit if the error is set.
*/
err error
realStartTime time.Time
}
func (s schedule) Hash() string {
return fmt.Sprint(s.offset, s.frequency, s.callback)
}
type scheduleBuilder struct {
schedule schedule
}
@@ -206,3 +210,33 @@ func convertTimeOfDayToActualOffset(t timeOfDay) time.Duration {
}
return TimeOfDay(0, int(mins))
}
// app.Start() functions
func RunSchedules(a *app) {
for {
sched := popSchedule(a)
// log.Default().Println(sched.realStartTime)
// run callback for all schedules before now in case they overlap
for sched.realStartTime.Before(time.Now()) {
go sched.callback(a.service, a.state)
requeueSchedule(a, sched)
sched = popSchedule(a)
}
time.Sleep(time.Until(sched.realStartTime))
go sched.callback(a.service, a.state)
requeueSchedule(a, sched)
}
}
func popSchedule(a *app) schedule {
_sched, _ := a.schedules.Pop()
return _sched.(schedule)
}
func requeueSchedule(a *app, s schedule) {
s.realStartTime = s.realStartTime.Add(s.frequency)
a.schedules.Insert(s, float64(s.realStartTime.Unix()))
}