allow handle same param path types with different macro functions as well, a use case: #1058

Former-commit-id: e7dcc5c0d9a2e3569e0f49303ff342bb8748baf5
This commit is contained in:
Gerasimos (Makis) Maropoulos 2019-08-14 08:56:03 +03:00
parent c6099a3c3b
commit 0a29c2bfc8
3 changed files with 14 additions and 4 deletions

View File

@ -142,7 +142,9 @@ func (repo *repository) getAll() []*Route {
func (repo *repository) register(route *Route) {
for i, r := range repo.routes {
if route.Equal(r) {
// 14 August 2019 allow register same path pattern with different macro functions,
// see #1058
if route.DeepEqual(r) {
// replace existing with the latest one.
repo.routes = append(repo.routes[:i], repo.routes[i+1:]...)
continue

View File

@ -234,10 +234,10 @@ func splitSubdomainAndPath(fullUnparsedPath string) (subdomain string, path stri
slashIdx := strings.IndexByte(s, '/')
if slashIdx == 0 {
// no subdomain
return "", cleanPath(s)
return "", s // cleanPath(s)
}
return s[0:slashIdx], cleanPath(s[slashIdx:]) // return subdomain without slash, path with slash
return s[0:slashIdx], s[slashIdx:] // cleanPath(s[slashIdx:]) // return subdomain without slash, path with slash
}
// RoutePathReverserOption option signature for the RoutePathReverser.

View File

@ -80,6 +80,7 @@ func NewRoute(method, subdomain, unparsedPath, mainHandlerName string,
MainHandlerName: mainHandlerName,
FormattedPath: formattedPath,
}
return route, nil
}
@ -157,13 +158,20 @@ func (r Route) String() string {
r.Method, r.Subdomain, r.Tmpl().Src)
}
// Equal compares the method, subdomaind and the
// Equal compares the method, subdomain and the
// underline representation of the route's path,
// instead of the `String` function which returns the front representation.
func (r *Route) Equal(other *Route) bool {
return r.Method == other.Method && r.Subdomain == other.Subdomain && r.Path == other.Path
}
// DeepEqual compares the method, subdomain, the
// underline representation of the route's path,
// and the template source.
func (r *Route) DeepEqual(other *Route) bool {
return r.Equal(other) && r.tmpl.Src == other.tmpl.Src
}
// Tmpl returns the path template,
// it contains the parsed template
// for the route's path.