| package engine |
|
|
| import ( |
| "log/slog" |
| "sync" |
| ) |
|
|
| |
| |
| |
| |
| |
| |
| type Router struct { |
| mode Mode |
| lite Engine |
| rules []RouteRule |
| mu sync.RWMutex |
| } |
|
|
| |
| |
| func NewRouter(mode Mode, lite Engine) *Router { |
| r := &Router{ |
| mode: mode, |
| lite: lite, |
| } |
|
|
| switch mode { |
| case ModeLite: |
| r.rules = []RouteRule{ |
| CapabilityRule{}, |
| DefaultLiteRule{}, |
| } |
| case ModeAuto: |
| r.rules = []RouteRule{ |
| CapabilityRule{}, |
| ContentHintRule{}, |
| DefaultChromeRule{}, |
| } |
| default: |
| r.rules = []RouteRule{ |
| DefaultChromeRule{}, |
| } |
| } |
|
|
| return r |
| } |
|
|
| |
| |
| func (r *Router) AddRule(rule RouteRule) { |
| r.mu.Lock() |
| defer r.mu.Unlock() |
|
|
| |
| if len(r.rules) > 0 { |
| last := r.rules[len(r.rules)-1] |
| r.rules[len(r.rules)-1] = rule |
| r.rules = append(r.rules, last) |
| } else { |
| r.rules = append(r.rules, rule) |
| } |
| slog.Info("engine: rule added", "rule", rule.Name(), "total", len(r.rules)) |
| } |
|
|
| |
| func (r *Router) RemoveRule(name string) bool { |
| r.mu.Lock() |
| defer r.mu.Unlock() |
| for i, rule := range r.rules { |
| if rule.Name() == name { |
| r.rules = append(r.rules[:i], r.rules[i+1:]...) |
| return true |
| } |
| } |
| return false |
| } |
|
|
| |
| func (r *Router) Route(op Capability, url string) Engine { |
| r.mu.RLock() |
| defer r.mu.RUnlock() |
|
|
| for _, rule := range r.rules { |
| switch rule.Decide(op, url) { |
| case UseLite: |
| if r.lite != nil { |
| return r.lite |
| } |
| |
| case UseChrome: |
| return nil |
| } |
| } |
| return nil |
| } |
|
|
| |
| |
| func (r *Router) UseLite(op Capability, url string) bool { |
| return r.Route(op, url) != nil |
| } |
|
|
| |
| func (r *Router) Lite() Engine { |
| return r.lite |
| } |
|
|
| |
| func (r *Router) Mode() Mode { |
| return r.mode |
| } |
|
|
| |
| func (r *Router) Rules() []string { |
| r.mu.RLock() |
| defer r.mu.RUnlock() |
| names := make([]string, len(r.rules)) |
| for i, rule := range r.rules { |
| names[i] = rule.Name() |
| } |
| return names |
| } |
|
|