-
Notifications
You must be signed in to change notification settings - Fork 0
/
impl_context_factory.go
108 lines (93 loc) · 2.3 KB
/
impl_context_factory.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
package cli
// DefaultContextFactory ...
type DefaultContextFactory struct {
}
func (inst *DefaultContextFactory) _Impl() ContextFactory {
return inst
}
// NewContext ...
func (inst *DefaultContextFactory) NewContext(cfg *Configuration) (*Context, error) {
ctx := &Context{}
ctx.Config = cfg
client, err := cfg.ClientFactory.NewClient(ctx)
if err != nil {
return nil, err
}
server, err := cfg.ServerFactory.NewServer(ctx)
if err != nil {
return nil, err
}
filters, err := inst.prepareFilters(ctx)
if err != nil {
return nil, err
}
handlers, err := inst.prepareHandlers(ctx)
if err != nil {
return nil, err
}
chain, err := inst.makeFilterChain(ctx, filters)
if err != nil {
return nil, err
}
ctx.Client = client
ctx.Server = server
ctx.CLI = &implCLI{context: ctx}
ctx.Chain = chain
ctx.Filters = filters
ctx.Handlers = handlers
return ctx, nil
}
func (inst *DefaultContextFactory) makeFilterChain(ctx *Context, src []*FilterRegistration) (FilterChain, error) {
builder := FilterChainBuilder{}
for _, hr := range src {
builder.AddFilterRegistration(hr)
}
return builder.Create(), nil
}
func (inst *DefaultContextFactory) prepareFilters(ctx *Context) ([]*FilterRegistration, error) {
src := ctx.Config.Filters
dst := make([]*FilterRegistration, 0)
table := make(map[string]*FilterRegistration)
for _, hr1 := range src {
group := hr1.GetFilters()
for _, hr2 := range group {
name := hr2.Name
old := table[name]
table[name] = hr2
if old != nil {
panic("the command name is duplicated, name=" + name)
}
inst.doInit(ctx, hr2.OnInit)
dst = append(dst, hr2)
}
}
return dst, nil
}
func (inst *DefaultContextFactory) prepareHandlers(ctx *Context) ([]*HandlerRegistration, error) {
src := ctx.Config.Handlers
dst := make([]*HandlerRegistration, 0)
table := make(map[string]*HandlerRegistration)
for _, hr1 := range src {
group := hr1.GetHandlers()
for _, hr2 := range group {
name := hr2.Name
old := table[name]
table[name] = hr2
if old != nil {
panic("the command name is duplicated, name=" + name)
}
inst.doInit(ctx, hr2.OnInit)
dst = append(dst, hr2)
}
}
return dst, nil
}
func (inst *DefaultContextFactory) doInit(c *Context, fn OnInitFunc) {
if c == nil || fn == nil {
return
}
err := fn(c)
if err != nil {
panic(err)
}
}