This commit is contained in:
@@ -2,6 +2,8 @@ package app
|
||||
|
||||
import (
|
||||
"log/slog"
|
||||
|
||||
"git.front.kjuulh.io/kjuulh/orbis/internal/scheduler"
|
||||
)
|
||||
|
||||
type App struct {
|
||||
@@ -17,3 +19,7 @@ func NewApp() *App {
|
||||
func (a *App) Logger() *slog.Logger {
|
||||
return a.logger
|
||||
}
|
||||
|
||||
func (a *App) Scheduler() *scheduler.Scheduler {
|
||||
return scheduler.NewScheduler(a.logger)
|
||||
}
|
||||
|
@@ -3,10 +3,26 @@ package app
|
||||
import (
|
||||
"log/slog"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"gitlab.com/greyxor/slogor"
|
||||
)
|
||||
|
||||
func setupLogging() *slog.Logger {
|
||||
return slog.New(slogor.NewHandler(os.Stderr))
|
||||
logLevelRaw := os.Getenv("ORBIS_LOG_LEVEL")
|
||||
var logLevel slog.Leveler
|
||||
switch strings.ToLower(logLevelRaw) {
|
||||
case "debug":
|
||||
logLevel = slog.LevelDebug
|
||||
case "info":
|
||||
logLevel = slog.LevelInfo
|
||||
case "warn":
|
||||
logLevel = slog.LevelWarn
|
||||
case "error":
|
||||
logLevel = slog.LevelError
|
||||
default:
|
||||
logLevel = slog.LevelInfo
|
||||
}
|
||||
|
||||
return slog.New(slogor.NewHandler(os.Stderr, slogor.SetLevel(logLevel)))
|
||||
}
|
||||
|
1
internal/lifecycles/lifecycles.go
Normal file
1
internal/lifecycles/lifecycles.go
Normal file
@@ -0,0 +1 @@
|
||||
package lifecycles
|
41
internal/scheduler/scheduler.go
Normal file
41
internal/scheduler/scheduler.go
Normal file
@@ -0,0 +1,41 @@
|
||||
package scheduler
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Scheduler struct {
|
||||
logger *slog.Logger
|
||||
}
|
||||
|
||||
func NewScheduler(logger *slog.Logger) *Scheduler {
|
||||
return &Scheduler{
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scheduler) Execute(ctx context.Context) error {
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
s.logger.Info("gracefully shutting down scheduler")
|
||||
return nil
|
||||
default:
|
||||
if err := s.process(ctx); err != nil {
|
||||
return fmt.Errorf("scheduler failed: %w", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Scheduler) process(ctx context.Context) error {
|
||||
s.logger.Debug("scheduler processing items")
|
||||
|
||||
// FIXME: simulate work
|
||||
time.Sleep(time.Second * 5)
|
||||
|
||||
return nil
|
||||
}
|
25
internal/utilities/singleton.go
Normal file
25
internal/utilities/singleton.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package utilities
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func Singleton[T any](init func() (T, error)) func() T {
|
||||
var (
|
||||
once sync.Once
|
||||
t T
|
||||
)
|
||||
|
||||
return func() T {
|
||||
once.Do(func() {
|
||||
var err error
|
||||
t, err = init()
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("creating %T failed: %s", t, err))
|
||||
}
|
||||
})
|
||||
|
||||
return t
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user