ducky/devices
ducky/devices/context.go
Separate out StorerFactory into its own interface. We had previously included a Factory and Destroy method in the Storer interface, but it makes more sense to separate those out into a StorerFactory interface. This lets us avoid the impression that we're using the same instance of a Storer for every test, separates the test methods away from the methods that are actually used in prod, and hides them from Godoc. What's not to like?
| paddy@0 | 1 package devices |
| paddy@0 | 2 |
| paddy@0 | 3 import ( |
| paddy@0 | 4 "errors" |
| paddy@0 | 5 |
| paddy@0 | 6 "golang.org/x/net/context" |
| paddy@0 | 7 ) |
| paddy@0 | 8 |
| paddy@0 | 9 const ( |
| paddy@0 | 10 storerKey = "code.secondbit.org/ducky/devices.hg#Storer" |
| paddy@0 | 11 ) |
| paddy@0 | 12 |
| paddy@0 | 13 var ( |
| paddy@0 | 14 // ErrNoStorerSet is returned when the Context has no Storer set in it. |
| paddy@0 | 15 ErrNoStorerSet = errors.New("storerKey not set in Context") |
| paddy@0 | 16 // ErrStorerKeyNotStorer is returned when there's a value in the Context for storerKey, but it's not a Storer. |
| paddy@0 | 17 ErrStorerKeyNotStorer = errors.New("the value for storerKey does not fulfill the Storer interface") |
| paddy@0 | 18 ) |
| paddy@0 | 19 |
| paddy@0 | 20 func getStorer(c context.Context) (Storer, error) { |
| paddy@0 | 21 val := c.Value(storerKey) |
| paddy@0 | 22 if val == nil { |
| paddy@0 | 23 return nil, ErrNoStorerSet |
| paddy@0 | 24 } |
| paddy@0 | 25 storer, ok := val.(Storer) |
| paddy@0 | 26 if !ok { |
| paddy@0 | 27 return nil, ErrStorerKeyNotStorer |
| paddy@0 | 28 } |
| paddy@0 | 29 return storer, nil |
| paddy@0 | 30 } |