Chromium Code Reviews| Index: service/datastore/context.go |
| diff --git a/service/datastore/context.go b/service/datastore/context.go |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..c81f3c98fb143839c6e82603ea10b5cf52d37cc8 |
| --- /dev/null |
| +++ b/service/datastore/context.go |
| @@ -0,0 +1,84 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +package datastore |
| + |
| +import ( |
| + "golang.org/x/net/context" |
| +) |
| + |
| +type key int |
| + |
| +var ( |
| + rawDatastoreKey key |
| + rawDatastoreFilterKey key = 1 |
| +) |
| + |
| +// RawFactory is the function signature for factory methods compatible with |
| +// SetRawFactory. |
| +type RawFactory func(context.Context) RawInterface |
| + |
| +// RawFilter is the function signature for a filter RDS implementation. It |
| +// gets the current RDS implementation, and returns a new RDS implementation |
| +// backed by the one passed in. |
| +type RawFilter func(context.Context, RawInterface) RawInterface |
| + |
| +// getUnfiltered gets gets the RawInterface implementation from context without |
| +// any of the filters applied. |
| +func getUnfiltered(c context.Context) RawInterface { |
| + if f, ok := c.Value(rawDatastoreKey).(RawFactory); ok && f != nil { |
| + return f(c) |
| + } |
| + return nil |
| +} |
| + |
| +// GetRaw gets the RawInterface implementation from context. |
| +func GetRaw(c context.Context) RawInterface { |
| + ret := getUnfiltered(c) |
| + if ret == nil { |
| + return nil |
| + } |
| + for _, f := range getCurFilters(c) { |
| + ret = f(c, ret) |
| + } |
| + return applyCheckFilter(c, ret) |
| +} |
| + |
| +// Get gets the Interface implementation from context. |
| +func Get(c context.Context) Interface { |
| + return &datastoreImpl{GetRaw(c)} |
| +} |
| + |
| +// SetRawFactory sets the function to produce Datastore instances, as returned by |
|
dnj (Google)
2015/08/03 18:00:18
80-character wrapping for comments.
|
| +// the GetRaw method. |
| +func SetRawFactory(c context.Context, rdsf RawFactory) context.Context { |
|
dnj (Google)
2015/08/03 18:00:18
rdsfrdsfrdsfrdsfrdsf
|
| + return context.WithValue(c, rawDatastoreKey, rdsf) |
| +} |
| + |
| +// SetRaw sets the current Datastore object in the context. Useful for testing with |
|
dnj (Google)
2015/08/03 18:00:18
80 character wrapping for comments.
|
| +// a quick mock. This is just a shorthand SetRawFactory invocation to set a factory |
| +// which always returns the same object. |
| +func SetRaw(c context.Context, rds RawInterface) context.Context { |
| + return SetRawFactory(c, func(context.Context) RawInterface { return rds }) |
| +} |
| + |
| +func getCurFilters(c context.Context) []RawFilter { |
| + curFiltsI := c.Value(rawDatastoreFilterKey) |
|
dnj (Google)
2015/08/03 18:00:18
Why not:
if curFiltsI, ok := c.Value(...).([]RawFi
|
| + if curFiltsI != nil { |
| + return curFiltsI.([]RawFilter) |
| + } |
| + return nil |
| +} |
| + |
| +// AddRawFilters adds RawInterface filters to the context. |
| +func AddRawFilters(c context.Context, filts ...RawFilter) context.Context { |
| + if len(filts) == 0 { |
| + return c |
| + } |
| + cur := getCurFilters(c) |
| + newFilts := make([]RawFilter, 0, len(cur)+len(filts)) |
| + newFilts = append(newFilts, getCurFilters(c)...) |
|
dnj (Google)
2015/08/03 18:00:18
Use "cur" here, instead of calling getCurFilters a
|
| + newFilts = append(newFilts, filts...) |
| + return context.WithValue(c, rawDatastoreFilterKey, newFilts) |
| +} |