@@ -2,11 +2,13 @@ package main
2
2
3
3
import (
4
4
"context"
5
- "fmt "
5
+ "errors "
6
6
"net/http"
7
+ "os"
7
8
8
9
// Packages
9
10
server "github.com/mutablelogic/go-server"
11
+ helloworld "github.com/mutablelogic/go-server/npm/helloworld"
10
12
httpresponse "github.com/mutablelogic/go-server/pkg/httpresponse"
11
13
provider "github.com/mutablelogic/go-server/pkg/provider"
12
14
ref "github.com/mutablelogic/go-server/pkg/ref"
@@ -20,23 +22,186 @@ import (
20
22
logger "github.com/mutablelogic/go-server/pkg/logger/config"
21
23
pg "github.com/mutablelogic/go-server/pkg/pgmanager/config"
22
24
pgqueue "github.com/mutablelogic/go-server/pkg/pgqueue/config"
23
-
24
- // Static content
25
- helloworld "github.com/mutablelogic/go-server/npm/helloworld"
26
25
)
27
26
28
27
///////////////////////////////////////////////////////////////////////////////
29
28
// TYPES
30
29
31
30
type ServiceCommands struct {
32
- Run ServiceRunCommand `cmd:"" group:"SERVICE" help:"Run the service"`
31
+ // Run ServiceRunCommand `cmd:"" group:"SERVICE" help:"Run the service"`
32
+ Run ServiceRunCommand `cmd:"" group:"SERVICE" help:"Run the service with plugins"`
33
+ Config ServiceConfigCommand `cmd:"" group:"SERVICE" help:"Output the plugin configuration"`
33
34
}
34
35
35
36
type ServiceRunCommand struct {
36
- Plugins []string `help:"Plugin paths"`
37
- Router struct {
37
+ Plugins []string `help:"Plugin paths" env:"PLUGIN_PATH"`
38
+ }
39
+
40
+ type ServiceConfigCommand struct {
41
+ ServiceRunCommand
42
+ }
43
+
44
+ ///////////////////////////////////////////////////////////////////////////////
45
+ // PUBLIC METHODS
46
+
47
+ func (cmd * ServiceConfigCommand ) Run (app server.Cmd ) error {
48
+ // Create a provider by loading the plugins
49
+ provider , err := provider .NewWithPlugins (cmd .Plugins ... )
50
+ if err != nil {
51
+ return err
52
+ }
53
+ return provider .WriteConfig (os .Stdout )
54
+ }
55
+
56
+ func (cmd * ServiceRunCommand ) Run (app server.Cmd ) error {
57
+ // Create a provider by loading the plugins
58
+ provider , err := provider .NewWithPlugins (cmd .Plugins ... )
59
+ if err != nil {
60
+ return err
61
+ }
62
+
63
+ // Set the configuration
64
+ err = errors .Join (err , provider .Load ("log" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
65
+ logger := config .(* logger.Config )
66
+ logger .Debug = app .GetDebug () >= server .Debug
67
+ return nil
68
+ }))
69
+ err = errors .Join (err , provider .Load ("httprouter" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
70
+ httprouter := config .(* httprouter.Config )
71
+ httprouter .Prefix = types .NormalisePath (app .GetEndpoint ().Path )
72
+ httprouter .Origin = "*"
73
+ httprouter .Middleware = []string {"log.main" }
74
+ return nil
75
+ }))
76
+ err = errors .Join (err , provider .Load ("httpserver" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
77
+ httpserver := config .(* httpserver.Config )
78
+ httpserver .Listen = app .GetEndpoint ()
79
+
80
+ // Set router
81
+ if router , ok := provider .Task (ctx , "httprouter.main" ).(http.Handler ); ! ok || router == nil {
82
+ return httpresponse .ErrInternalError .With ("Invalid router" )
83
+ } else {
84
+ httpserver .Router = router
85
+ }
86
+
87
+ // Return success
88
+ return nil
89
+ }))
90
+ err = errors .Join (err , provider .Load ("helloworld" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
91
+ helloworld := config .(* helloworld.Config )
92
+
93
+ // Set router
94
+ if router , ok := provider .Task (ctx , "httprouter.main" ).(server.HTTPRouter ); ! ok || router == nil {
95
+ return httpresponse .ErrInternalError .With ("Invalid router" )
96
+ } else {
97
+ helloworld .Router = router
98
+ }
99
+
100
+ // Return success
101
+ return nil
102
+ }))
103
+ err = errors .Join (err , provider .Load ("pgpool" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
104
+ pgpool := config .(* pg.Config )
105
+
106
+ // Set router
107
+ if router , ok := provider .Task (ctx , "httprouter.main" ).(server.HTTPRouter ); ! ok || router == nil {
108
+ return httpresponse .ErrInternalError .With ("Invalid router" )
109
+ } else {
110
+ pgpool .Router = router
111
+ }
112
+
113
+ // Set trace
114
+ if app .GetDebug () == server .Trace {
115
+ pgpool .Trace = func (ctx context.Context , query string , args any , err error ) {
116
+ if err != nil {
117
+ ref .Log (ctx ).With ("args" , args ).Print (ctx , err , " ON " , query )
118
+ } else {
119
+ ref .Log (ctx ).With ("args" , args ).Debug (ctx , query )
120
+ }
121
+ }
122
+ }
123
+
124
+ // Return success
125
+ return nil
126
+ }))
127
+ err = errors .Join (err , provider .Load ("auth" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
128
+ auth := config .(* auth.Config )
129
+
130
+ // Set the router
131
+ if router , ok := ref .Provider (ctx ).Task (ctx , "httprouter" ).(server.HTTPRouter ); ! ok || router == nil {
132
+ return httpresponse .ErrInternalError .With ("Invalid router" )
133
+ } else {
134
+ auth .Router = router
135
+ }
136
+
137
+ // Set the connection pool
138
+ if pool , ok := ref .Provider (ctx ).Task (ctx , "pgpool" ).(server.PG ); ! ok || pool == nil {
139
+ return httpresponse .ErrInternalError .With ("Invalid connection pool" )
140
+ } else {
141
+ auth .Pool = pool
142
+ }
143
+
144
+ // Return success
145
+ return nil
146
+ }))
147
+ err = errors .Join (err , provider .Load ("pgqueue" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
148
+ pgqueue := config .(* pgqueue.Config )
149
+
150
+ // Set the router
151
+ if router , ok := ref .Provider (ctx ).Task (ctx , "httprouter" ).(server.HTTPRouter ); ! ok || router == nil {
152
+ return httpresponse .ErrInternalError .With ("Invalid router" )
153
+ } else {
154
+ pgqueue .Router = router
155
+ }
156
+
157
+ // Set the connection pool
158
+ if pool , ok := ref .Provider (ctx ).Task (ctx , "pgpool" ).(server.PG ); ! ok || pool == nil {
159
+ return httpresponse .ErrInternalError .With ("Invalid connection pool" )
160
+ } else {
161
+ pgqueue .Pool = pool
162
+ }
163
+
164
+ return nil
165
+ }))
166
+ err = errors .Join (err , provider .Load ("certmanager" , "main" , func (ctx context.Context , label string , config server.Plugin ) error {
167
+ certmanager := config .(* cert.Config )
168
+
169
+ // Set the router
170
+ if router , ok := ref .Provider (ctx ).Task (ctx , "httprouter" ).(server.HTTPRouter ); ! ok || router == nil {
171
+ return httpresponse .ErrInternalError .With ("Invalid router" )
172
+ } else {
173
+ certmanager .Router = router
174
+ }
175
+
176
+ // Set the connection pool
177
+ if pool , ok := ref .Provider (ctx ).Task (ctx , "pgpool" ).(server.PG ); ! ok || pool == nil {
178
+ return httpresponse .ErrInternalError .With ("Invalid connection pool" )
179
+ } else {
180
+ certmanager .Pool = pool
181
+ }
182
+
183
+ // Set the queue
184
+ if queue , ok := ref .Provider (ctx ).Task (ctx , "pgqueue" ).(server.PGQueue ); ! ok || queue == nil {
185
+ return httpresponse .ErrInternalError .With ("Invalid task queue" )
186
+ } else {
187
+ certmanager .Queue = queue
188
+ }
189
+
190
+ return nil
191
+ }))
192
+ if err != nil {
193
+ return err
194
+ }
195
+
196
+ // Run the provider
197
+ return provider .Run (app .Context ())
198
+ }
199
+
200
+ /*
201
+ type ServiceRunCommand struct {
202
+ Router struct {
38
203
httprouter.Config `embed:"" prefix:"router."` // Router configuration
39
- } `embed:""`
204
+ } `embed:"" prefix:"" `
40
205
Server struct {
41
206
httpserver.Config `embed:"" prefix:"server."` // Server configuration
42
207
} `embed:""`
@@ -55,24 +220,11 @@ type ServiceRunCommand struct {
55
220
Log struct {
56
221
logger.Config `embed:"" prefix:"log."` // Logger configuration
57
222
} `embed:""`
58
- HelloWorld struct {
59
- helloworld.Config `embed:"" prefix:"helloworld."` // HelloWorld configuration
60
- } `embed:""`
61
223
}
224
+ */
62
225
63
- ///////////////////////////////////////////////////////////////////////////////
64
- // PUBLIC METHODS
65
-
226
+ /*
66
227
func (cmd *ServiceRunCommand) Run(app server.Cmd) error {
67
- // Load plugins
68
- plugins , err := provider .LoadPluginsForPattern (cmd .Plugins ... )
69
- if err != nil {
70
- return err
71
- }
72
- for _ , plugin := range plugins {
73
- fmt .Println ("TODO: Loaded plugins:" , plugin .Name ())
74
- }
75
-
76
228
// Set the server listener and router prefix
77
229
cmd.Server.Listen = app.GetEndpoint()
78
230
cmd.Router.Prefix = types.NormalisePath(cmd.Server.Listen.Path)
@@ -134,19 +286,6 @@ func (cmd *ServiceRunCommand) Run(app server.Cmd) error {
134
286
// Return the new configuration with the router
135
287
return config, nil
136
288
137
- case "helloworld" :
138
- config := plugin .(helloworld.Config )
139
-
140
- // Set the router
141
- if router , ok := ref .Provider (ctx ).Task (ctx , "httprouter" ).(server.HTTPRouter ); ! ok || router == nil {
142
- return nil , httpresponse .ErrInternalError .Withf ("Invalid router %q" , "httprouter" )
143
- } else {
144
- config .Router = router
145
- }
146
-
147
- // Return the new configuration with the router
148
- return config , nil
149
-
150
289
case "auth":
151
290
config := plugin.(auth.Config)
152
291
@@ -214,11 +353,12 @@ func (cmd *ServiceRunCommand) Run(app server.Cmd) error {
214
353
215
354
// No-op
216
355
return plugin, nil
217
- }, cmd .Log .Config , cmd .Router .Config , cmd .Server .Config , cmd .HelloWorld . Config , cmd . Auth .Config , cmd .PGPool .Config , cmd .PGQueue .Config , cmd .CertManager .Config )
356
+ }, cmd.Log.Config, cmd.Router.Config, cmd.Server.Config, cmd.Auth.Config, cmd.PGPool.Config, cmd.PGQueue.Config, cmd.CertManager.Config)
218
357
if err != nil {
219
358
return err
220
359
}
221
360
222
361
// Run the provider
223
362
return provider.Run(app.Context())
224
363
}
364
+ */
0 commit comments