package scopes import ( "fmt" "os" "os/signal" "syscall" "git.sr.ht/~cco/go-scopes/common" "git.sr.ht/~cco/go-scopes/config" ) type Cfg struct { *config.Base AppType string Home string } func Start(ctx common.Context) { for _, cfg := range ctx.Config().Children() { cctx := ctx.ChildContext(cfg) cfg.Starter()(cctx) fmt.Println(cfg.Name(), " started") } fmt.Println("running ", ctx.WaitGroup()) defer func() { close(ctx.Done()) ctx.WaitGroup().Wait() fmt.Println("finishing ", ctx.WaitGroup()) //ctx.LogDebug("Dispatcher exited", m.Map{}) }() sig := make(chan os.Signal, 1) signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) for step(ctx, sig) { } } func step(ctx common.Context, sig <-chan os.Signal) bool { select { case <-sig: fmt.Println("interrupted") //ctx.LogInfo("Dispatcher interrupted", m.Map{}) return false case msg := <-ctx.Mailbox(): fmt.Println("message", msg) //ctx.LogDebug("dispatcherStep", m.Map{"msg": msg}) if msg == "quit" { //ctx.LogInfo("Dispatcher stopped", m.Map{}) return false } //ctx.HandleMsg(&msg) } return true } // definitions func RunApp(cfg common.Config) { ctx := common.AppContext(cfg) cfg.Starter()(ctx) }