forked from wasmCloud/wasmCloud
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
121 lines (103 loc) · 3.24 KB
/
main.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
109
110
111
112
113
114
115
116
117
118
119
120
121
//go:generate wit-bindgen-wrpc go --out-dir bindings --package github.com/wasmCloud/wasmCloud/examples/go/providers/custom-template/bindings wit
package main
import (
"log"
"os"
"os/signal"
"syscall"
server "github.com/wasmCloud/wasmCloud/examples/go/providers/custom-template/bindings"
"go.wasmcloud.dev/provider"
)
func main() {
if err := run(); err != nil {
log.Fatal(err)
}
}
func run() error {
// Initialize the provider with callbacks to track linked components
providerHandler := Handler{
linkedFrom: make(map[string]map[string]string),
linkedTo: make(map[string]map[string]string),
}
p, err := provider.New(
provider.SourceLinkPut(func(link provider.InterfaceLinkDefinition) error {
return handleNewSourceLink(&providerHandler, link)
}),
provider.TargetLinkPut(func(link provider.InterfaceLinkDefinition) error {
return handleNewTargetLink(&providerHandler, link)
}),
provider.SourceLinkDel(func(link provider.InterfaceLinkDefinition) error {
return handleDelSourceLink(&providerHandler, link)
}),
provider.TargetLinkDel(func(link provider.InterfaceLinkDefinition) error {
return handleDelTargetLink(&providerHandler, link)
}),
provider.HealthCheck(func() string {
return handleHealthCheck(&providerHandler)
}),
provider.Shutdown(func() error {
return handleShutdown(&providerHandler)
}),
)
if err != nil {
return err
}
// Store the provider for use in the handlers
providerHandler.provider = p
// Setup two channels to await RPC and control interface operations
providerCh := make(chan error, 1)
signalCh := make(chan os.Signal, 1)
// Handle RPC operations
stopFunc, err := server.Serve(p.RPCClient, &providerHandler)
if err != nil {
p.Shutdown()
return err
}
// Handle control interface operations
go func() {
err := p.Start()
providerCh <- err
}()
// Shutdown on SIGINT
signal.Notify(signalCh, syscall.SIGINT)
// Run provider until either a shutdown is requested or a SIGINT is received
select {
case err = <-providerCh:
stopFunc()
return err
case <-signalCh:
p.Shutdown()
stopFunc()
}
return nil
}
func handleNewSourceLink(handler *Handler, link provider.InterfaceLinkDefinition) error {
handler.provider.Logger.Info("Handling new source link", "link", link)
handler.linkedTo[link.Target] = link.SourceConfig
return nil
}
func handleNewTargetLink(handler *Handler, link provider.InterfaceLinkDefinition) error {
handler.provider.Logger.Info("Handling new target link", "link", link)
handler.linkedFrom[link.SourceID] = link.TargetConfig
return nil
}
func handleDelSourceLink(handler *Handler, link provider.InterfaceLinkDefinition) error {
handler.provider.Logger.Info("Handling del source link", "link", link)
delete(handler.linkedTo, link.SourceID)
return nil
}
func handleDelTargetLink(handler *Handler, link provider.InterfaceLinkDefinition) error {
handler.provider.Logger.Info("Handling del target link", "link", link)
delete(handler.linkedFrom, link.Target)
return nil
}
func handleHealthCheck(handler *Handler) string {
handler.provider.Logger.Info("Handling health check")
return "provider healthy"
}
func handleShutdown(handler *Handler) error {
handler.provider.Logger.Info("Handling shutdown")
clear(handler.linkedFrom)
clear(handler.linkedTo)
return nil
}