go-scopes/core/core.go

52 lines
1 KiB
Go

package core
import (
lib "git.sr.ht/~cco/go-scopes"
"git.sr.ht/~cco/go-scopes/config"
"git.sr.ht/~cco/go-scopes/core/action"
"git.sr.ht/~cco/go-scopes/logging"
)
func None(_ lib.Context) {}
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
}