package cron import ( "context" "fmt" "show-rss/src/feeds" "time" "github.com/robfig/cron/v3" ) func Main(ctx context.Context) error { c := time.NewTicker(time.Minute) defer c.Stop() for { if err := One(ctx); err != nil { return err } select { case <-ctx.Done(): case <-c.C: } } return ctx.Err() } func One(ctx context.Context) error { f, err := feeds.New(ctx) if err != nil { return err } return f.ForEach(ctx, func(feed feeds.Feed) error { if err := one(ctx, feed); err != nil { return fmt.Errorf("failed to cron %s (%+v): %w", feed.Entry.ID, feed.Version, err) } return nil }) } func one(ctx context.Context, feed feeds.Feed) error { if schedule, err := cron.NewParser( cron.SecondOptional | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow | cron.Descriptor, ).Parse(feed.Version.Cron); err != nil { return fmt.Errorf("illegal cron %q", feed.Version.Cron) } else if next := schedule.Next(feed.Execution.Executed); time.Now().Before(next) { return nil } return fmt.Errorf("should GET %s", feed.Version.URL) f, err := feeds.New(ctx) if err != nil { return fmt.Errorf("failed new feeds to executed %s: %w", feed.Entry.ID, err) } return f.Executed(ctx, feed.Entry.ID, feed.Version.Created) }