forked from asynkron/protoactor-go
/
middlewarepropagation.go
59 lines (50 loc) · 2.13 KB
/
middlewarepropagation.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
package propagator
import (
"github.com/ChaokunChang/protoactor-go/actor"
)
type MiddlewarePropagator struct {
spawnMiddleware []actor.SpawnMiddleware
senderMiddleware []actor.SenderMiddleware
receiverMiddleware []actor.ReceiverMiddleware
contextDecorators []actor.ContextDecorator
}
func New() *MiddlewarePropagator {
return &MiddlewarePropagator{}
}
func (propagator *MiddlewarePropagator) WithItselfForwarded() *MiddlewarePropagator {
return propagator.WithSpawnMiddleware(propagator.SpawnMiddleware)
}
func (propagator *MiddlewarePropagator) WithSpawnMiddleware(middleware ...actor.SpawnMiddleware) *MiddlewarePropagator {
propagator.spawnMiddleware = append(propagator.spawnMiddleware, middleware...)
return propagator
}
func (propagator *MiddlewarePropagator) WithSenderMiddleware(middleware ...actor.SenderMiddleware) *MiddlewarePropagator {
propagator.senderMiddleware = append(propagator.senderMiddleware, middleware...)
return propagator
}
func (propagator *MiddlewarePropagator) WithReceiverMiddleware(middleware ...actor.ReceiverMiddleware) *MiddlewarePropagator {
propagator.receiverMiddleware = append(propagator.receiverMiddleware, middleware...)
return propagator
}
func (propagator *MiddlewarePropagator) WithContextDecorator(decorators ...actor.ContextDecorator) *MiddlewarePropagator {
propagator.contextDecorators = append(propagator.contextDecorators, decorators...)
return propagator
}
func (propagator *MiddlewarePropagator) SpawnMiddleware(next actor.SpawnFunc) actor.SpawnFunc {
return func(id string, props *actor.Props, parentContext actor.SpawnerContext) (pid *actor.PID, e error) {
if propagator.spawnMiddleware != nil {
props = props.WithSpawnMiddleware(propagator.spawnMiddleware...)
}
if propagator.senderMiddleware != nil {
props = props.WithSenderMiddleware(propagator.senderMiddleware...)
}
if propagator.receiverMiddleware != nil {
props = props.WithReceiverMiddleware(propagator.receiverMiddleware...)
}
if propagator.contextDecorators != nil {
props = props.WithContextDecorator(propagator.contextDecorators...)
}
pid, err := next(id, props, parentContext)
return pid, err
}
}