ducky/devices

Paddy 2015-11-20 Parent:34130c700842 Child:74dbc04879a7

9:f5a9d5f8f28d Go to Latest

ducky/devices/memstore.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?

History
1 package devices
3 import (
4 "sync"
6 "code.secondbit.org/uuid.hg"
7 "golang.org/x/net/context"
8 )
10 type Memstore struct {
11 devices map[string]Device
12 lock sync.RWMutex
13 }
15 func NewMemstore() *Memstore {
16 return &Memstore{
17 devices: map[string]Device{},
18 }
19 }
21 func (m *Memstore) GetDevices(ids []uuid.ID, c context.Context) (map[string]Device, error) {
22 m.lock.RLock()
23 defer m.lock.RUnlock()
25 results := map[string]Device{}
27 for _, id := range ids {
28 device, ok := m.devices[id.String()]
29 if !ok {
30 continue
31 }
32 results[id.String()] = device
33 }
34 return results, nil
35 }
37 func (m *Memstore) UpdateDevice(change DeviceChange, c context.Context) error {
38 return nil
39 }
41 func (m *Memstore) DeleteDevices(id []uuid.ID, c context.Context) error {
42 return nil
43 }
45 func (m *Memstore) CreateDevices(devices []Device, c context.Context) error {
46 m.lock.Lock()
47 defer m.lock.Unlock()
49 for _, device := range devices {
50 if _, ok := m.devices[device.ID.String()]; ok {
51 return ErrDeviceAlreadyExists(device.ID)
52 }
53 }
55 for _, device := range devices {
56 m.devices[device.ID.String()] = device
57 }
58 return nil
59 }
61 func (m *Memstore) ListDevicesByOwner(user uuid.ID, c context.Context) ([]Device, error) {
62 var devices []Device
63 for _, device := range m.devices {
64 if !device.Owner.Equal(user) {
65 continue
66 }
67 devices = append(devices, device)
68 }
69 return devices, nil
70 }