/
configContainerBuilder.go
91 lines (71 loc) · 2.99 KB
/
configContainerBuilder.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
package container
//RuntimeContainerBuilder builds a Runtime container
type RuntimeContainerBuilder struct{}
//BuildContainerFromConfig given a config it will build a container, panics if config is wrong
func (rc RuntimeContainerBuilder) BuildContainerFromConfig(trees ...Tree) Container {
runtimeContainer, err := rc.BuildContainerFromConfigSecure(trees...)
panicIfError(err)
return runtimeContainer
}
//BuildContainerFromConfigSecure given a config it will build a container, if config is wrong an error is returned
func (rc RuntimeContainerBuilder) BuildContainerFromConfigSecure(trees ...Tree) (Container, error) {
runtimeContainer := NewRuntimeContainer()
mergedTree := rc.mergeTrees(trees)
err := ValidateConfigSecure(mergedTree)
if err != nil {
return runtimeContainer, err
}
rc.addTreeToContainer(mergedTree, runtimeContainer)
return runtimeContainer, nil
}
func (rc RuntimeContainerBuilder) addTreeToContainer(tree Tree, c *RuntimeContainer) {
for _, node := range tree {
rc.addNode(node, c)
}
}
func (rc RuntimeContainerBuilder) addNode(node Node, container *RuntimeContainer) {
if node.NewFunc != nil {
rc.addNewFunc(node.ID, node.NewFunc, node.ServiceNames, container)
} else if node.Constr != nil {
rc.addConstr(node.ID, node.Constr, container)
} else if node.Ev.Service != "" {
rc.addEvent(node.Ev.Name, node.Ev.Service, container)
} else if node.Ob.Name != "" {
rc.addObserver(node.Ob.Event, node.Ob.Name, node.Ob.Callback, container)
}
if node.Parameters != nil {
rc.addParameters(node.Parameters, container)
}
if node.ParamProvider != nil {
rc.addParametersProvider(node.ParamProvider, container)
}
if node.GarbageFunc != nil {
container.AddGarbageCollectFunc(node.ID, node.GarbageFunc)
}
}
func (rc RuntimeContainerBuilder) addNewFunc(serviceID string, newFunc interface{}, serviceNames []string, container *RuntimeContainer) {
container.AddNewMethod(serviceID, newFunc, serviceNames...)
}
func (rc RuntimeContainerBuilder) addConstr(serviceID string, constr Constructor, container *RuntimeContainer) {
container.AddConstructor(serviceID, constr)
}
func (rc RuntimeContainerBuilder) addEvent(eventName, dependencyName string, container *RuntimeContainer) {
container.RegisterDependencyEvent(eventName, dependencyName)
}
func (rc RuntimeContainerBuilder) addObserver(eventName, observerID string, callback interface{}, container *RuntimeContainer) {
container.AddDependencyObserver(eventName, observerID, callback)
}
func (rc RuntimeContainerBuilder) addParameters(parameters map[string]interface{}, container *RuntimeContainer) {
RegisterParameters(container, parameters)
}
func (rc RuntimeContainerBuilder) addParametersProvider(parametersProvider ParametersProvider, container *RuntimeContainer) {
parameters := parametersProvider.GetItems()
rc.addParameters(parameters, container)
}
func (rc RuntimeContainerBuilder) mergeTrees(trees []Tree) Tree {
mergedTree := []Node{}
for _, tree := range trees {
mergedTree = append(mergedTree, tree...)
}
return Tree(mergedTree)
}