feat: initial commit
This commit is contained in:
44
internal/infrastructure/router/rule_based_router.go
Normal file
44
internal/infrastructure/router/rule_based_router.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package router
|
||||
|
||||
import (
|
||||
"context"
|
||||
"regexp"
|
||||
"sort"
|
||||
|
||||
"github.com/paramah/gw_telegram/internal/domain/apperror"
|
||||
"github.com/paramah/gw_telegram/internal/domain/entity"
|
||||
)
|
||||
|
||||
type Rule struct {
|
||||
Pattern *regexp.Regexp
|
||||
IntentName string
|
||||
Target entity.RouteTarget
|
||||
Priority int
|
||||
}
|
||||
|
||||
type RuleBasedRouter struct {
|
||||
rules []Rule
|
||||
}
|
||||
|
||||
func NewRuleBasedRouter(rules []Rule) *RuleBasedRouter {
|
||||
sorted := make([]Rule, len(rules))
|
||||
copy(sorted, rules)
|
||||
sort.Slice(sorted, func(i, j int) bool {
|
||||
return sorted[i].Priority > sorted[j].Priority
|
||||
})
|
||||
return &RuleBasedRouter{rules: sorted}
|
||||
}
|
||||
|
||||
func (r *RuleBasedRouter) Route(_ context.Context, msg entity.Message) (entity.Route, error) {
|
||||
for _, rule := range r.rules {
|
||||
if rule.Pattern.MatchString(msg.Text) {
|
||||
return entity.Route{
|
||||
Pattern: rule.Pattern.String(),
|
||||
IntentName: rule.IntentName,
|
||||
Target: rule.Target,
|
||||
Priority: rule.Priority,
|
||||
}, nil
|
||||
}
|
||||
}
|
||||
return entity.Route{}, apperror.ErrRouteNotFound
|
||||
}
|
||||
Reference in New Issue
Block a user