package app import ( "os" "os/signal" "syscall" "git.sr.ht/~cco/go-scopes/config" "git.sr.ht/~cco/go-scopes/lib" "git.sr.ht/~cco/go-scopes/lib/message" "git.sr.ht/~cco/go-scopes/logging" ) type Cfg struct { *config.BaseCfg AppType string Home string Logging *logging.Cfg } func Start(ctx lib.Context) { lib.RunCtx(ctx, start) } func start(ctx lib.Context) { defer ctx.Stop() for _, cfg := range ctx.Config().Children() { cctx := ctx.ChildContext(cfg) cfg.Starter()(cctx) } logging.Info(ctx).Msg("app.start: running") sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) for step(ctx, sig) { } } func step(ctx lib.Context, sig <-chan os.Signal) bool { select { case <-sig: logging.Info(ctx).Msg("app.step: interrupted") return false case msg := <-ctx.Mailbox(): //log.Debug().Str("msg.action", msg.Action()).Msg("app.step: message") if msg == message.Quit { logging.Info(ctx).Msg("app.step: stopped") return false } return lib.HandleMsg(ctx, msg) case <-ctx.Done(): return false } return true }