-
Notifications
You must be signed in to change notification settings - Fork 50
/
transformer.go
101 lines (78 loc) · 2.9 KB
/
transformer.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
package mdlsub
import (
"context"
"fmt"
"github.com/justtrackio/gosoline/pkg/cfg"
"github.com/justtrackio/gosoline/pkg/log"
"github.com/spf13/cast"
)
type Model interface {
GetId() interface{}
}
type ModelDb struct {
Id *uint `gorm:"primary_key;"`
}
func (m ModelDb) GetId() interface{} {
return *m.Id
}
//go:generate mockery --name ModelTransformer
type ModelTransformer interface {
GetInput() interface{}
Transform(ctx context.Context, inp interface{}) (out Model, err error)
}
type (
ModelTransformers map[string]VersionedModelTransformers
TransformerFactory func(ctx context.Context, config cfg.Config, logger log.Logger) (ModelTransformer, error)
TransformerMapTypeVersionFactories map[string]TransformerMapVersionFactories
TransformerMapVersionFactories map[int]TransformerFactory
VersionedModelTransformers map[int]ModelTransformer
)
func initTransformers(ctx context.Context, config cfg.Config, logger log.Logger, subscriberSettings map[string]*SubscriberSettings, transformerFactories TransformerMapTypeVersionFactories) (ModelTransformers, error) {
var err error
transformers := make(ModelTransformers)
for name, settings := range subscriberSettings {
modelId := settings.SourceModel.String()
if _, ok := transformerFactories[modelId]; !ok {
return nil, fmt.Errorf("can not create transformers: there is no transformer for subscriber %s with modelId %s", name, modelId)
}
}
for modelId, versionedFactories := range transformerFactories {
transformers[modelId] = make(map[int]ModelTransformer)
for version, factory := range versionedFactories {
if transformers[modelId][version], err = factory(ctx, config, logger); err != nil {
return nil, fmt.Errorf("can not create transformer for modelId %s in version %d: %w", modelId, version, err)
}
}
}
return transformers, nil
}
func NewGenericTransformer(transformer ModelTransformer) func(context.Context, cfg.Config, log.Logger) (ModelTransformer, error) {
return func(_ context.Context, _ cfg.Config, _ log.Logger) (ModelTransformer, error) {
return transformer, nil
}
}
type ModelSpecification struct {
CrudType string
Version int
ModelId string
}
func getModelSpecification(attributes map[string]string) (*ModelSpecification, error) {
var ok bool
var err error
var spec ModelSpecification
if _, ok = attributes["type"]; !ok {
return nil, fmt.Errorf("the message has no attribute named 'type'")
}
spec.CrudType = attributes["type"]
if _, ok := attributes["version"]; !ok {
return nil, fmt.Errorf("the message has no attribute named 'version'")
}
if spec.Version, err = cast.ToIntE(attributes["version"]); err != nil {
return nil, fmt.Errorf("version is not an int: %v", attributes["version"])
}
if _, ok = attributes["modelId"]; !ok {
return nil, fmt.Errorf("the message has no attribute named 'modelId'")
}
spec.ModelId = attributes["modelId"]
return &spec, nil
}