Index: service/rawdatastore/context.go |
diff --git a/service/rawdatastore/context.go b/service/rawdatastore/context.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..431049cec8d111ec07f1ba8acc24f6b9e9f5ec7d |
--- /dev/null |
+++ b/service/rawdatastore/context.go |
@@ -0,0 +1,79 @@ |
+// 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 rawdatastore |
+ |
+import ( |
+ "golang.org/x/net/context" |
+) |
+ |
+type key int |
+ |
+var ( |
+ rawDatastoreKey key |
+ rawDatastoreFilterKey key = 1 |
+) |
+ |
+// Factory is the function signature for factory methods compatible with |
+// SetFactory. |
+type Factory func(context.Context) Interface |
+ |
+// Filter 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 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(rawDatastoreKey).(Factory); ok && f != nil { |
+ return f(c) |
+ } |
+ return nil |
+} |
+ |
+// Get gets the Interface implementation from context. |
+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 Datastore instances, as returned by |
+// the Get method. |
+func SetFactory(c context.Context, rdsf Factory) context.Context { |
+ return context.WithValue(c, rawDatastoreKey, rdsf) |
+} |
+ |
+// Set sets the current Datastore object in the context. Useful for testing with |
+// a quick mock. This is just a shorthand SetFactory invocation to set a factory |
+// which always returns the same object. |
+func Set(c context.Context, rds Interface) context.Context { |
+ return SetFactory(c, func(context.Context) Interface { return rds }) |
+} |
+ |
+func getCurFilters(c context.Context) []Filter { |
+ curFiltsI := c.Value(rawDatastoreFilterKey) |
+ if curFiltsI != nil { |
+ return curFiltsI.([]Filter) |
+ } |
+ return nil |
+} |
+ |
+// 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, rawDatastoreFilterKey, newFilts) |
+} |