/
db.go
82 lines (67 loc) · 1.2 KB
/
db.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package db
import (
"fmt"
)
type DBer interface {
Create(string, *StoredURL) error
Get(string) (*StoredURL, error)
}
type StoredURL struct {
OriginalURL string `json:"original_string"`
}
type ErrBase struct {
Message string
}
func (e *ErrBase) Error() string {
return e.Message
}
type ErrCollision struct {
ErrBase
}
func NewErrCollision(message string) *ErrCollision {
return &ErrCollision{
ErrBase: ErrBase{message},
}
}
type ErrDB struct {
ErrBase
}
func NewErrDB(message string) *ErrDB {
return &ErrDB{
ErrBase: ErrBase{message},
}
}
type ErrNotFound struct {
ErrBase
}
func NewErrNotFound(message string) error {
return &ErrNotFound{
ErrBase: ErrBase{message},
}
}
type MapDB struct {
M map[string]*StoredURL
}
func (m *MapDB) Create(key string, value *StoredURL) error {
stored, exists := m.M[key]
if exists {
if *stored == *value {
return nil
}
}
m.M[key] = value
return nil
}
func (m *MapDB) Get(key string) (*StoredURL, error) {
var err error
value, exists := m.M[key]
if !exists {
return nil, NewErrNotFound(fmt.Sprintf("key %s does not exist in db", key))
}
return value, err
}
func NewMapDB() *MapDB {
return &MapDB{
M: make(map[string]*StoredURL),
}
}