forked from andradeandrey/fwk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
registry.go
81 lines (68 loc) · 1.91 KB
/
registry.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
package fwk
import (
"reflect"
"sort"
)
// FactoryFunc creates a Component of type t and name n, managed by the fwk.App mgr.
type FactoryFunc func(t, n string, mgr App) (Component, error)
// factoryDb associates a fully-qualified type-name (pkg-path + type-name) with
// a component factory-function.
type factoryDb map[string]FactoryFunc
var gFactory = make(factoryDb)
// Register registers a type t with the FactoryFunc fct.
//
// fwk.ComponentMgr will then be able to create new values of that type t
// using the associated FactoryFunc fct.
// If a type t was already registered, the previous FactoryFunc value will be
// silently overridden with the new FactoryFunc value.
func Register(t reflect.Type, fct FactoryFunc) {
comp := t.PkgPath() + "." + t.Name()
gFactory[comp] = fct
//fmt.Printf("### factories ###\n%v\n", gFactory)
}
// Registry returns the list of all registered and known components.
func Registry() []string {
comps := make([]string, 0, len(gFactory))
for k := range gFactory {
comps = append(comps, k)
}
sort.Strings(comps)
return comps
}
// New creates a new Component value with type t and name n.
func (app *appmgr) New(t, n string) (Component, error) {
var err error
fct, ok := gFactory[t]
if !ok {
return nil, Errorf("no component with type [%s] registered", t)
}
if _, dup := app.props[n]; dup {
return nil, Errorf("component with name [%s] already created", n)
}
app.props[n] = make(map[string]interface{})
c, err := fct(t, n, app)
if err != nil {
return nil, Errorf("error creating [%s:%s] %v", t, n, err)
}
if c.Name() == "" {
return nil, Errorf("factory for [%s] does NOT set the name of the component", t)
}
err = app.addComponent(c)
if err != nil {
return nil, err
}
switch c := c.(type) {
case Svc:
err = app.AddSvc(c)
if err != nil {
return nil, err
}
case Task:
err = app.AddTask(c)
if err != nil {
return nil, err
}
}
return c, err
}
// EOF