Luigit
repositories / bugabinga.net

bugabinga.net

personal infrastructure for bugabinga!

owned by admin

services/luci/internal/ciconfig/cron.go

Raw
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)
}