1package cron
 2
 3import (
 4	"context"
 5	"time"
 6
 7	"github.com/charmbracelet/log"
 8	"github.com/robfig/cron/v3"
 9)
10
11// CronScheduler is a cron-like job scheduler.
12type CronScheduler struct {
13	*cron.Cron
14	logger cron.Logger
15}
16
17// Entry is a cron job.
18type Entry struct {
19	ID   cron.EntryID
20	Desc string
21	Spec string
22}
23
24// cronLogger is a wrapper around the logger to make it compatible with the
25// cron logger.
26type cronLogger struct {
27	logger *log.Logger
28}
29
30// Info logs routine messages about cron's operation.
31func (l cronLogger) Info(msg string, keysAndValues ...interface{}) {
32	l.logger.Debug(msg, keysAndValues...)
33}
34
35// Error logs an error condition.
36func (l cronLogger) Error(err error, msg string, keysAndValues ...interface{}) {
37	l.logger.Error(msg, append(keysAndValues, "err", err)...)
38}
39
40// NewCronScheduler returns a new Cron.
41func NewCronScheduler() *CronScheduler {
42	logger := cronLogger{log.WithPrefix("server.cron")}
43	return &CronScheduler{
44		Cron: cron.New(cron.WithLogger(logger)),
45	}
46}
47
48// Shutdonw gracefully shuts down the CronServer.
49func (s *CronScheduler) Shutdown() {
50	ctx, cancel := context.WithTimeout(s.Cron.Stop(), 30*time.Second)
51	defer func() { cancel() }()
52	<-ctx.Done()
53}
54
55// Start starts the CronServer.
56func (s *CronScheduler) Start() {
57	s.Cron.Start()
58}