69 lines
1.1 KiB
Go
Raw Normal View History

2026-03-19 16:37:57 +08:00
package routerx
import "fmt"
type Matcher func(level int) bool
type Route struct {
Index int
Name string
Match Matcher
Enabled bool
}
type Snapshot struct {
Index int
Name string
Match Matcher
}
func Normalize(routes []Route) []Snapshot {
if len(routes) == 0 {
return nil
}
result := make([]Snapshot, 0, len(routes))
for _, route := range routes {
if !route.Enabled {
continue
}
name := route.Name
if name == "" {
name = fmt.Sprintf("route-%d", route.Index)
}
match := route.Match
if match == nil {
match = MatchAllLevels()
}
result = append(result, Snapshot{
Index: route.Index,
Name: name,
Match: match,
})
}
return result
}
func MatchAllLevels() Matcher {
return func(level int) bool {
_ = level
return true
}
}
func MatchLevels(levels ...int) Matcher {
levelSet := make(map[int]struct{}, len(levels))
for _, level := range levels {
levelSet[level] = struct{}{}
}
return func(level int) bool {
_, ok := levelSet[level]
return ok
}
}
func MatchAtLeast(minLevel int) Matcher {
return func(level int) bool {
return level >= minLevel
}
}