55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
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"
|
|
"git.sr.ht/~cco/go-scopes/logging/log"
|
|
)
|
|
|
|
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)
|
|
}
|
|
log.Info().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:
|
|
log.Info().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 {
|
|
log.Info().Msg("app.step: stopped")
|
|
return false
|
|
}
|
|
return lib.HandleMsg(ctx, msg)
|
|
case <-ctx.Done():
|
|
return false
|
|
}
|
|
return true
|
|
}
|