-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfixtures.go
77 lines (64 loc) · 1.71 KB
/
fixtures.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
// Package fixtures importing data from YAML files in database for REL.
//
// Usage:
//
// repo := fixtures.New()
// // Register all needed types
// repo.Register(&MyTableType{})
//
// // Import data from YAML content
// err := repo.Import(ctx, db, content)
package fixtures
import (
"context"
"log"
"reflect"
"github.com/go-rel/rel"
)
// Logger to be used by the repository to notify about warnings.
type Logger interface {
Warn(msg string)
}
type defaultLogger struct{}
func (l defaultLogger) Warn(msg string) {
log.Println(msg)
}
// BeforeSave interface can be implemented by a type to allow changing type data before saving data to database.
type BeforeSave interface {
BeforeSave(context.Context) error
}
// Repsitory of fixtures that can be loaded and imported.
type Repository struct {
log Logger
registry map[string]any
order []string
skipResolve bool
}
// New creates a new fixtures repository.
func New() *Repository {
return &Repository{
log: defaultLogger{},
registry: make(map[string]any, 10),
order: make([]string, 0, 10),
}
}
// Register a type that can be loaded as fixture.
func (r *Repository) Register(v any) {
if reflect.ValueOf(v).Kind() != reflect.Ptr {
v = reflect.New(reflect.TypeOf(v)).Interface()
}
name := rel.NewDocument(v).Meta().Table()
if _, ok := r.registry[name]; ok {
return
}
r.registry[name] = v
r.order = append(r.order, name)
}
// SetLogger sets the logger to be used by the repository to notify about warnings.
func (r *Repository) SetLogger(l Logger) {
r.log = l
}
// SetSkipResolve sets whether the repository should skip resolving relations and use registration order.
func (r *Repository) SetSkipResolve(skip bool) {
r.skipResolve = skip
}