ducky/devices

Paddy 2015-11-28 Parent:683050b4546b Child:1ae5bae472c1

12:03c49b4d3d9f Go to Latest

ducky/devices/memstore.go

Add doc comments to all our exported types. It makes golint happy, and it's a good thing to do. It's kind of shameful that we went so long without them. Oops.

History
1 package devices
3 import (
4 "sync"
6 "code.secondbit.org/uuid.hg"
7 "golang.org/x/net/context"
8 )
10 // Memstore is an in-memory implementation of Storer, and should
11 // only be used for testing or for temporary local servers.
12 type Memstore struct {
13 devices map[string]Device
14 lock sync.RWMutex
15 }
17 // NewMemstore returns a Memstore that is ready to be used as a
18 // Storer implementation.
19 func NewMemstore() *Memstore {
20 return &Memstore{
21 devices: map[string]Device{},
22 }
23 }
25 // GetDevices returns any Devices in the Memstore that match the
26 // passed IDs. If an ID cannot be matched to a Device in the
27 // Memstore, it is ignored. The result is a map, with the values
28 // being the Devices that could be found, and the keys being the
29 // result of the String() method for each Device's ID.
30 //
31 // An empty map is a possible response, if none of the IDs could
32 // be found.
33 func (m *Memstore) GetDevices(ids []uuid.ID, c context.Context) (map[string]Device, error) {
34 m.lock.RLock()
35 defer m.lock.RUnlock()
37 results := map[string]Device{}
39 for _, id := range ids {
40 device, ok := m.devices[id.String()]
41 if !ok {
42 continue
43 }
44 results[id.String()] = device
45 }
46 return results, nil
47 }
49 // UpdateDevice applies the passed DeviceChange to the Device
50 // in the Memstore specified by the DeviceChange's DeviceID
51 // property. If no Device in the Memstore matches the DeviceChange's
52 // DeviceID property, then an ErrDeviceNotFound error will be
53 // returned.
54 func (m *Memstore) UpdateDevice(change DeviceChange, c context.Context) error {
55 m.lock.Lock()
56 defer m.lock.Unlock()
58 device, ok := m.devices[change.DeviceID.String()]
59 if !ok {
60 return ErrDeviceNotFound
61 }
63 device = ApplyChange(device, change)
64 m.devices[change.DeviceID.String()] = device
66 return nil
67 }
69 // DeleteDevices will remove any Devices from the Memstore that match
70 // the IDs passed in. If an ID can't be matched to a Device in the
71 // Memstore, then it is ignored.
72 func (m *Memstore) DeleteDevices(id []uuid.ID, c context.Context) error {
73 return nil
74 }
76 // CreateDevices stores the passed devices in the Memstore as a single
77 // transaction. If a Device's ID already exists in the Memstore, an
78 // ErrDeviceAlreadyExists error with that Device's ID is returned, and
79 // none of the passed Devices are stored.
80 func (m *Memstore) CreateDevices(devices []Device, c context.Context) error {
81 m.lock.Lock()
82 defer m.lock.Unlock()
84 for _, device := range devices {
85 if _, ok := m.devices[device.ID.String()]; ok {
86 return ErrDeviceAlreadyExists(device.ID)
87 }
88 }
90 for _, device := range devices {
91 m.devices[device.ID.String()] = device
92 }
93 return nil
94 }
96 // ListDevicesByOwner returns all the Devices in the Memstore that have an
97 // Owner property that matches the passed ID. If no Devices have an Owner
98 // property matching the passed ID, an empty slice is returned.
99 //
100 // ListDevicesByOwner does not guarantee any sort order for the Devices.
101 func (m *Memstore) ListDevicesByOwner(user uuid.ID, c context.Context) ([]Device, error) {
102 var devices []Device
103 for _, device := range m.devices {
104 if !device.Owner.Equal(user) {
105 continue
106 }
107 devices = append(devices, device)
108 }
109 return devices, nil
110 }