Skip to content
Find file
5233dc7
76 lines (61 sloc) 1.72 KB
package lion
import "golang.org/x/net/context"
// Check Context implements net.Context
var _ context.Context = (*Context)(nil)
// type ContextI interface {
// context.Context
// Param(string) string
// }
// Context implements golang.org/x/net/context.Context and stores values of url parameters
type Context struct {
context.Context
parent context.Context
keys []string
values []string
}
// NewContext creates a new context instance
func NewContext() *Context {
return NewContextWithParent(context.Background())
}
// NewContextWithParent creates a new context with a parent context specified
func NewContextWithParent(c context.Context) *Context {
return &Context{
parent: c,
}
}
// Value returns the value for the passed key. If it is not found in the url params it returns parent's context Value
func (p *Context) Value(key interface{}) interface{} {
if k, ok := key.(string); ok {
return p.Param(k)
}
return p.parent.Value(key)
}
func (p *Context) addParam(key, val string) {
p.keys = append(p.keys, key)
p.values = append(p.values, val)
}
// Param returns the value of a param
func (p *Context) Param(key string) string {
for i, name := range p.keys {
if name == key {
return p.values[i]
}
}
return ""
}
func (p *Context) reset() {
p.keys = p.keys[:0]
p.values = p.values[:0]
p.parent = nil
}
// C returns a Context based on a context.Context passed. If it does not convert to Context, it creates a new one with the context passed as argument.
func C(c context.Context) *Context {
if ctx, ok := c.(*Context); ok {
return ctx
}
return NewContextWithParent(c)
}
// Param returns the value of a url param base on the passed context
func Param(c context.Context, key string) string {
return C(c).Param(key)
}
Something went wrong with that request. Please try again.