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) { func (repo *repository) register(route *Route) {
for i, r := range repo.routes { 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. // replace existing with the latest one.
repo.routes = append(repo.routes[:i], repo.routes[i+1:]...) repo.routes = append(repo.routes[:i], repo.routes[i+1:]...)
continue continue

View File

@ -234,10 +234,10 @@ func splitSubdomainAndPath(fullUnparsedPath string) (subdomain string, path stri
slashIdx := strings.IndexByte(s, '/') slashIdx := strings.IndexByte(s, '/')
if slashIdx == 0 { if slashIdx == 0 {
// no subdomain // 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. // RoutePathReverserOption option signature for the RoutePathReverser.

View File

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