-
Notifications
You must be signed in to change notification settings - Fork 2
/
integration.go
89 lines (67 loc) · 2.67 KB
/
integration.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
package sdkintegrations
import (
"context"
"go.autokitteh.dev/autokitteh/sdk/sdkerrors"
"go.autokitteh.dev/autokitteh/sdk/sdkmodule"
"go.autokitteh.dev/autokitteh/sdk/sdkservices"
"go.autokitteh.dev/autokitteh/sdk/sdktypes"
)
type integration struct {
desc sdktypes.Integration
mod sdkmodule.Module
connTest func(context.Context, sdktypes.ConnectionID) (sdktypes.Status, error)
connStatus func(context.Context, sdktypes.ConnectionID) (sdktypes.Status, error)
}
type OptFn func(*integration)
func WithConnectionTest(fn func(context.Context, sdktypes.ConnectionID) (sdktypes.Status, error)) OptFn {
return func(i *integration) { i.connTest = fn }
}
func WithConnectionStatus(fn func(context.Context, sdktypes.ConnectionID) (sdktypes.Status, error)) OptFn {
return func(i *integration) { i.connStatus = fn }
}
// NewIntegration creates a new integration, augmenting the given `desc` with
// the members defintion from `mod`.
func NewIntegration(
desc sdktypes.Integration,
mod sdkmodule.Module,
opts ...OptFn,
) sdkservices.Integration {
i := &integration{mod: mod}
for _, opt := range opts {
opt(i)
}
i.desc = desc.UpdateModule(mod.Describe())
if i.connTest != nil {
i.desc = i.desc.WithConnectionCapabilities(i.desc.ConnectionCapabilities().WithSupportsConnectionTest(true))
}
connURL := i.desc.ConnectionURL()
i.desc = i.desc.WithConnectionCapabilities(i.desc.ConnectionCapabilities().WithSupportsConnectionInit(connURL != nil && connURL.String() != ""))
if i.connStatus == nil {
i.connStatus = func(_ context.Context, cid sdktypes.ConnectionID) (sdktypes.Status, error) {
if !cid.IsValid() {
return i.desc.InitialConnectionStatus(), nil
}
return sdktypes.NewStatus(sdktypes.StatusCodeUnspecified, ""), nil
}
}
return i
}
func (i *integration) Get() sdktypes.Integration { return i.desc }
func (i *integration) Configure(ctx context.Context, cid sdktypes.ConnectionID) (map[string]sdktypes.Value, error) {
return i.mod.Configure(ctx, sdktypes.NewExecutorID(i.desc.ID()), cid)
}
func (i *integration) Call(ctx context.Context, function sdktypes.Value, args []sdktypes.Value, kwargs map[string]sdktypes.Value) (sdktypes.Value, error) {
return i.mod.Call(ctx, function, args, kwargs)
}
func (i *integration) TestConnection(ctx context.Context, cid sdktypes.ConnectionID) (sdktypes.Status, error) {
if i.connTest == nil {
return sdktypes.InvalidStatus, sdkerrors.ErrNotImplemented
}
return i.connTest(ctx, cid)
}
func (i *integration) GetConnectionStatus(ctx context.Context, cid sdktypes.ConnectionID) (sdktypes.Status, error) {
if i.connStatus == nil {
return sdktypes.InvalidStatus, sdkerrors.ErrNotImplemented
}
return i.connStatus(ctx, cid)
}