50 lines
1.3 KiB
Go
50 lines
1.3 KiB
Go
package taskutil
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/robfig/cron/v3"
|
|
)
|
|
|
|
// cronParser is a shared parser instance. Standard 5-field cron with
|
|
// optional descriptors (@hourly, @daily, @weekly, @monthly, etc.).
|
|
var cronParser = cron.NewParser(
|
|
cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor,
|
|
)
|
|
|
|
// NextRunFromSchedule computes the next run time from a cron expression
|
|
// and timezone. Returns nil for "once" schedules (one-shot tasks).
|
|
//
|
|
// Replaces the v0.27.1 hand-rolled parseDailyCron with full 5-field
|
|
// cron support via robfig/cron/v3.
|
|
func NextRunFromSchedule(schedule, timezone string) *time.Time {
|
|
if schedule == "once" {
|
|
return nil
|
|
}
|
|
|
|
now := time.Now()
|
|
if tz, err := time.LoadLocation(timezone); err == nil {
|
|
now = now.In(tz)
|
|
}
|
|
|
|
sched, err := cronParser.Parse(schedule)
|
|
if err != nil {
|
|
// Unparseable — log at call site, caller decides fallback
|
|
return nil
|
|
}
|
|
|
|
next := sched.Next(now).UTC()
|
|
return &next
|
|
}
|
|
|
|
// ValidateCron checks whether a cron expression is valid.
|
|
// Returns nil for valid expressions, error describing the problem otherwise.
|
|
// "once" is always valid (one-shot schedule).
|
|
func ValidateCron(schedule string) error {
|
|
if schedule == "once" {
|
|
return nil
|
|
}
|
|
_, err := cronParser.Parse(schedule)
|
|
return err
|
|
}
|