blob: b12b7ef15b3c77f63ae14ac6347200481f86aec1 [file] [log] [blame]
David K. Bainbridgef0da8732016-06-01 16:15:37 -07001package main
2
David K. Bainbridge546cdc32016-06-29 15:30:22 -07003import (
4 "fmt"
5 "net/url"
6 "strings"
7)
8
David K. Bainbridgef0da8732016-06-01 16:15:37 -07009type Storage interface {
10 Put(id string, update StatusMsg) error
11 Get(id string) (*StatusMsg, error)
12 List() ([]StatusMsg, error)
13}
14
David K. Bainbridge546cdc32016-06-29 15:30:22 -070015func NewStorage(spec string) (Storage, error) {
16 conn, err := url.Parse(spec)
17 if err != nil {
18 return nil, err
19 }
20
21 switch strings.ToUpper(conn.Scheme) {
22 case "MEMORY":
23 return NewMemoryStorage(), nil
24 case "CONSUL":
25 return NewConsulStorage(spec)
26 default:
27 return nil, fmt.Errorf("Unknown storage scheme specified, '%s'", conn.Scheme)
28 }
29}
30
David K. Bainbridgef0da8732016-06-01 16:15:37 -070031type MemoryStorage struct {
32 Data map[string]StatusMsg
33}
34
35func NewMemoryStorage() *MemoryStorage {
36 return &MemoryStorage{
37 Data: make(map[string]StatusMsg),
38 }
39}
40
41func (s *MemoryStorage) Put(id string, update StatusMsg) error {
42 s.Data[id] = update
David K. Bainbridgef0da8732016-06-01 16:15:37 -070043 return nil
44}
45
46func (s *MemoryStorage) Get(id string) (*StatusMsg, error) {
47 m, ok := s.Data[id]
48 if !ok {
49 return nil, nil
50 }
51 return &m, nil
52}
53
54func (s *MemoryStorage) List() ([]StatusMsg, error) {
55 r := make([]StatusMsg, len(s.Data))
56 i := 0
57 for _, v := range s.Data {
58 r[i] = v
David K. Bainbridge97ee8052016-06-14 00:52:07 -070059 i += 1
David K. Bainbridgef0da8732016-06-01 16:15:37 -070060 }
61 return r, nil
62}