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}