58 lines
1.6 KiB
Go
58 lines
1.6 KiB
Go
|
package httprouter
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
)
|
||
|
|
||
|
// Param is a single URL parameter, consisting of a key and a value.
|
||
|
type Param struct {
|
||
|
Key string
|
||
|
Value string
|
||
|
}
|
||
|
|
||
|
// Params is a Param-slice, as returned by the router.
|
||
|
// The slice is ordered, the first URL parameter is also the first slice value.
|
||
|
// It is therefore safe to read values by the index.
|
||
|
type Params []Param
|
||
|
|
||
|
// ByName returns the value of the first Param which key matches the given name.
|
||
|
// If no matching Param is found, an empty string is returned.
|
||
|
func (ps Params) ByName(name string) string {
|
||
|
for i := range ps {
|
||
|
if ps[i].Key == name {
|
||
|
return ps[i].Value
|
||
|
}
|
||
|
}
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
type paramsContextKey struct{}
|
||
|
|
||
|
// WithParams returns a new Context that contains ps.
|
||
|
func WithParams(ctx context.Context, ps Params) context.Context {
|
||
|
return context.WithValue(ctx, paramsContextKey{}, ps)
|
||
|
}
|
||
|
|
||
|
// GetParams returns the Params from the Context of the Request.
|
||
|
func GetParams(req *http.Request) Params {
|
||
|
return GetParamsFromContext(req.Context())
|
||
|
}
|
||
|
|
||
|
// GetParamsFromContext returns the Params from the Context.
|
||
|
func GetParamsFromContext(ctx context.Context) Params {
|
||
|
ps, _ := ctx.Value(paramsContextKey{}).(Params)
|
||
|
return ps
|
||
|
}
|
||
|
|
||
|
// GetParam returns the value of the first Param which key matches in the Context
|
||
|
// of the Request.
|
||
|
func GetParam(req *http.Request, key string) string {
|
||
|
return GetParamFromContext(req.Context(), key)
|
||
|
}
|
||
|
|
||
|
// GetParam returns the value of the first Param which key matches in the Context.
|
||
|
func GetParamFromContext(ctx context.Context, key string) string {
|
||
|
return GetParamsFromContext(ctx).ByName(key)
|
||
|
}
|