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
 | |
| }
 |