package task import ( "context" "log/slog" "time" ) type Task struct { Name string Interval time.Duration Handler func(ctx context.Context) error } type Scheduler struct { tasks []Task log *slog.Logger } func NewScheduler(log *slog.Logger) *Scheduler { return &Scheduler{log: log.With("component", "scheduler")} } func (s *Scheduler) Add(name string, interval time.Duration, handler func(ctx context.Context) error) { s.tasks = append(s.tasks, Task{ Name: name, Interval: interval, Handler: handler, }) } func (s *Scheduler) Start(ctx context.Context) { for _, task := range s.tasks { go func(t Task) { ticker := time.NewTicker(t.Interval) defer ticker.Stop() s.log.Info("task started", "name", t.Name, "interval", t.Interval) for { select { case <-ctx.Done(): return case <-ticker.C: if err := t.Handler(ctx); err != nil { s.log.Error("task failed", "name", t.Name, "err", err) } } } }(task) } }