| 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)
|
| +}
|
|
|