package ciconfig import ( "fmt" "strings" "time" "github.com/robfig/cron/v3" ) var cronParser = cron.NewParser(cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow) func ParseSchedule(expression string) (schedule cron.Schedule, err error) { defer func() { if recovered := recover(); recovered != nil { schedule = nil err = fmt.Errorf("invalid schedule %q", expression) } }() if strings.Contains(expression, "=") || len(strings.Fields(expression)) != 5 { return nil, fmt.Errorf("schedule requires five-field cron in UTC") } schedule, err = cronParser.Parse(expression) if err != nil { return nil, fmt.Errorf("invalid five-field cron schedule") } return schedule, nil } func ScheduleMatches(expression string, minute time.Time) bool { schedule, err := ParseSchedule(expression) if err != nil { return false } minute = minute.UTC().Truncate(time.Minute) return schedule.Next(minute.Add(-time.Minute)).Equal(minute) }