| Index: service/user/context.go
|
| diff --git a/service/user/context.go b/service/user/context.go
|
| index c86a830b7c2da737c6b1a654324e62c5da11bb63..21061667e825d2daa91f650b699b345b983fb8f7 100644
|
| --- a/service/user/context.go
|
| +++ b/service/user/context.go
|
| @@ -10,21 +10,50 @@ import (
|
|
|
| type key int
|
|
|
| -var serviceKey key
|
| +var (
|
| + serviceKey key
|
| + serviceFilterKey key = 1
|
| +)
|
|
|
| // Factory is the function signature for factory methods compatible with
|
| // SetFactory.
|
| type Factory func(context.Context) Interface
|
|
|
| -// Get pulls the user service implementation from context or nil if it
|
| -// wasn't set.
|
| -func Get(c context.Context) Interface {
|
| +// Filter is the function signature for a filter user implementation. It
|
| +// gets the current user implementation, and returns a new user implementation
|
| +// backed by the one passed in.
|
| +type Filter func(context.Context, Interface) Interface
|
| +
|
| +// getUnfiltered gets gets the Interface implementation from context without
|
| +// any of the filters applied.
|
| +func getUnfiltered(c context.Context) Interface {
|
| if f, ok := c.Value(serviceKey).(Factory); ok && f != nil {
|
| return f(c)
|
| }
|
| return nil
|
| }
|
|
|
| +func getCurFilters(c context.Context) []Filter {
|
| + curFiltsI := c.Value(serviceFilterKey)
|
| + if curFiltsI != nil {
|
| + return curFiltsI.([]Filter)
|
| + }
|
| + return nil
|
| +}
|
| +
|
| +// Get pulls the user service implementation from context or nil if it
|
| +// wasn't set.
|
| +func Get(c context.Context) Interface {
|
| + ret := getUnfiltered(c)
|
| + if ret == nil {
|
| + return nil
|
| + }
|
| + for _, f := range getCurFilters(c) {
|
| + ret = f(c, ret)
|
| + }
|
| + return ret
|
| +}
|
| +
|
| // SetFactory sets the function to produce user.Interface instances,
|
| // as returned by the Get method.
|
| func SetFactory(c context.Context, f Factory) context.Context {
|
| @@ -37,3 +66,15 @@ func SetFactory(c context.Context, f Factory) context.Context {
|
| func Set(c context.Context, u Interface) context.Context {
|
| return SetFactory(c, func(context.Context) Interface { return u })
|
| }
|
| +
|
| +// AddFilters adds Interface filters to the context.
|
| +func AddFilters(c context.Context, filts ...Filter) context.Context {
|
| + if len(filts) == 0 {
|
| + return c
|
| + }
|
| + cur := getCurFilters(c)
|
| + newFilts := make([]Filter, 0, len(cur)+len(filts))
|
| + newFilts = append(newFilts, getCurFilters(c)...)
|
| + newFilts = append(newFilts, filts...)
|
| + return context.WithValue(c, serviceFilterKey, newFilts)
|
| +}
|
|
|