-
Notifications
You must be signed in to change notification settings - Fork 1
/
trampoline.go
92 lines (80 loc) · 1.73 KB
/
trampoline.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
package miruken
import (
"github.com/miruken-go/miruken/promise"
)
type Trampoline struct {
callback any
}
func (t *Trampoline) Callback() any {
return t.callback
}
func (t *Trampoline) Source() any {
if cb, ok := t.callback.(Callback); ok {
return cb.Source()
}
return nil
}
func (t *Trampoline) Policy() Policy {
if cb, ok := t.callback.(Callback); ok {
return cb.Policy()
}
return nil
}
func (t *Trampoline) Result(
many bool,
) (any, *promise.Promise[any]) {
if cb, ok := t.callback.(Callback); ok {
return cb.Result(many)
}
return nil, nil
}
func (t *Trampoline) SetResult(result any) {
if cb, ok := t.callback.(Callback); ok {
cb.SetResult(result)
}
}
func (t *Trampoline) CanInfer() bool {
if infer, ok := t.callback.(interface{ CanInfer() bool }); ok {
return infer.CanInfer()
}
return true
}
func (t *Trampoline) CanFilter() bool {
if filter, ok := t.callback.(interface{ CanFilter() bool }); ok {
return filter.CanFilter()
}
return true
}
func (t *Trampoline) CanBatch() bool {
if batch, ok := t.callback.(interface{ CanBatch() bool }); ok {
return batch.CanBatch()
}
return true
}
func (t *Trampoline) CanDispatch(
handler any,
binding Binding,
) (reset func(), approved bool) {
if cb := t.callback; cb != nil {
if guard, ok := cb.(CallbackGuard); ok {
return guard.CanDispatch(handler, binding)
}
}
return nil, true
}
func (t *Trampoline) Dispatch(
callback any,
handler any,
greedy bool,
composer Handler,
) HandleResult {
if callback == nil {
panic("callback cannot be nil")
}
if cb := t.callback; cb != nil {
return DispatchCallback(handler, cb, greedy, composer)
}
var builder HandlesBuilder
return builder.WithCallback(callback).New().
Dispatch(handler, greedy, composer)
}