/
gen_schema_repository.go
115 lines (94 loc) · 2.49 KB
/
gen_schema_repository.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// This file was automatically generated by genny.
// Any changes will be lost if this file is regenerated.
// see https://github.com/cheekybits/genny
package core
import (
"encoding/json"
"errors"
"io/ioutil"
"sync"
)
type repositorySchema struct {
items map[string]Schema
mu sync.RWMutex
}
// SchemaRepository is the ...
type SchemaRepository interface {
Pull(key string) *Schema // (fixme) > evaluate whether make senses to do not return a pointer ...
Push(elem Schema) (Schema, error)
PushFromFile(filename string) (Schema, error)
PushFromData(data []byte) (Schema, error)
List() []Schema
Clean()
}
// List returns all elements
func (repo *repositorySchema) List() []Schema {
repo.mu.RLock()
defer repo.mu.RUnlock()
res := make([]Schema, len(repo.items))
i := 0
for _, elem := range repo.items {
res[i] = elem
i++
}
return res
}
// Pull provides the element for a given key, or nil if it does not exist within the repository.
func (repo *repositorySchema) Pull(key string) *Schema {
repo.mu.RLock()
defer repo.mu.RUnlock()
if item, ok := repo.items[key]; ok {
return &item
}
return nil
}
// PushFromData allows to store an elem within its repository
func (repo *repositorySchema) Push(elem Schema) (Schema, error) {
repo.mu.Lock()
defer repo.mu.Unlock()
var id string
if id = interface{}(elem).(Identifiable).GetIdentifier(); id == "" {
return elem, errors.New("missing identifier")
}
repo.items[id] = elem
return elem, nil
}
// PushFromData allows to load an element from bytes and to store it within its repository
func (repo *repositorySchema) PushFromData(data []byte) (Schema, error) {
var elem Schema
err := json.Unmarshal(data, &elem)
if err != nil {
return elem, err
}
return repo.Push(elem)
}
// PushFromFile allows to load an element from file system and to store it within its repository
func (repo *repositorySchema) PushFromFile(filename string) (Schema, error) {
var elem Schema
bytes, err := ioutil.ReadFile(filename)
if err != nil {
return elem, err
}
return repo.PushFromData(bytes)
}
// Clean empties the repository
func (repo *repositorySchema) Clean() {
repo.mu.Lock()
defer repo.mu.Unlock()
for k := range repo.items {
delete(repo.items, k)
}
}
var (
repoSchema *repositorySchema
onceSchema sync.Once
)
// GetSchemaRepository is a singleton repository for core schemas
func GetSchemaRepository() SchemaRepository {
onceSchema.Do(func() {
repoSchema = &repositorySchema{
items: make(map[string]Schema),
}
})
return repoSchema
}