package core import ( "git.sr.ht/~cco/go-scopes/config" "git.sr.ht/~cco/go-scopes/lib" "git.sr.ht/~cco/go-scopes/lib/action" "git.sr.ht/~cco/go-scopes/logging" ) func Start(ctx lib.Context) { logging.Debug(ctx).Msg("core.Start") lib.RunCtx(ctx, Listen) } func Listen(ctx lib.Context) { step := ctx.Config().Step() for step(ctx) { } } func Step(ctx lib.Context) (loop bool) { loop = true //defer ctx.LogCatch("Step") select { case msg := <-ctx.Mailbox(): loop = lib.HandleMsg(ctx, msg) case <-ctx.Done(): loop = ctx.Config().DoneHandler()(ctx) } return } func HandleMessage(ctx lib.Context, msg lib.Message) (loop bool) { loop = true logging.Debug(ctx).Str("msg.action", msg.Action()).Msg("core.HandleMessage") for _, act := range action.Select(ctx, msg) { loop = act.Handle() } return } func HandleDone(ctx lib.Context) bool { return false } func init() { config.DefaultStep = Step // avoid import cycle config.DefaultMsgHandler = HandleMessage config.DefaultDoneHandler = HandleDone }