mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-24 17:28:31 +02:00
feat(route): implement PreferOver method for deterministic route replacement
This commit is contained in:
@@ -497,6 +497,45 @@ func (r *Route) DisplayName() string {
|
||||
return r.Homepage.Name
|
||||
}
|
||||
|
||||
// PreferOver implements pool.Preferable to resolve duplicate route keys deterministically.
|
||||
// Preference policy:
|
||||
// - Prefer routes with rules over routes without rules.
|
||||
// - If rules tie, prefer non-docker routes (explicit config) over docker-discovered routes.
|
||||
// - Otherwise, prefer the new route to preserve existing semantics.
|
||||
func (r *Route) PreferOver(other any) bool {
|
||||
// Try to get the underlying *Route of the other value
|
||||
var or *Route
|
||||
switch v := other.(type) {
|
||||
case *Route:
|
||||
or = v
|
||||
case *ReveseProxyRoute:
|
||||
or = v.Route
|
||||
case *FileServer:
|
||||
or = v.Route
|
||||
case *StreamRoute:
|
||||
or = v.Route
|
||||
default:
|
||||
// Unknown type, allow replacement
|
||||
return true
|
||||
}
|
||||
|
||||
// Prefer routes that have rules
|
||||
if len(r.Rules) > 0 && len(or.Rules) == 0 {
|
||||
return true
|
||||
}
|
||||
if len(r.Rules) == 0 && len(or.Rules) > 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
// Prefer explicit (non-docker) over docker auto-discovered
|
||||
if (r.Container == nil) != (or.Container == nil) {
|
||||
return r.Container == nil
|
||||
}
|
||||
|
||||
// Default: allow replacement
|
||||
return true
|
||||
}
|
||||
|
||||
func (r *Route) ContainerInfo() *types.Container {
|
||||
return r.Container
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user