39 рядки
1.1 KiB
Go
39 рядки
1.1 KiB
Go
package shared
|
|
|
|
import (
|
|
"github.com/mymmrac/telego"
|
|
th "github.com/mymmrac/telego/telegohandler"
|
|
|
|
"git.entityseven.com/rilaxik/pllist/internal/domain"
|
|
"git.entityseven.com/rilaxik/pllist/internal/service"
|
|
)
|
|
|
|
// PendingHandler consumes free text for a feature after its prompt.
|
|
type PendingHandler func(
|
|
ctx *th.Context, user domain.User, pending service.Pending, message telego.Message,
|
|
) error
|
|
|
|
// PendingRouter lets features own their prompt handlers without making the
|
|
// root dispatcher know every feature.
|
|
type PendingRouter struct {
|
|
handlers map[service.PendingAction]PendingHandler
|
|
}
|
|
|
|
func NewPendingRouter() *PendingRouter {
|
|
return &PendingRouter{handlers: make(map[service.PendingAction]PendingHandler)}
|
|
}
|
|
|
|
func (r *PendingRouter) Register(action service.PendingAction, handler PendingHandler) {
|
|
r.handlers[action] = handler
|
|
}
|
|
|
|
func (r *PendingRouter) Dispatch(
|
|
ctx *th.Context, user domain.User, pending service.Pending, message telego.Message,
|
|
) (bool, error) {
|
|
handler, ok := r.handlers[pending.Action]
|
|
if !ok {
|
|
return false, nil
|
|
}
|
|
return true, handler(ctx, user, pending, message)
|
|
}
|