nunu-layout-admin/pkg/app/app.go

75 lines
1.2 KiB
Go

package app
import (
"context"
"log"
"nunu-layout-admin/pkg/server"
"os"
"os/signal"
"syscall"
)
type App struct {
name string
servers []server.Server
}
type Option func(a *App)
func NewApp(opts ...Option) *App {
a := &App{}
for _, opt := range opts {
opt(a)
}
return a
}
func WithServer(servers ...server.Server) Option {
return func(a *App) {
a.servers = servers
}
}
func WithName(name string) Option {
return func(a *App) {
a.name = name
}
}
func (a *App) Run(ctx context.Context) error {
var cancel context.CancelFunc
ctx, cancel = context.WithCancel(ctx)
defer cancel()
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
for _, srv := range a.servers {
go func(srv server.Server) {
err := srv.Start(ctx)
if err != nil {
log.Printf("Server start err: %v", err)
}
}(srv)
}
select {
case <-signals:
// Received termination signal
log.Println("Received termination signal")
case <-ctx.Done():
// Context canceled
log.Println("Context canceled")
}
// Gracefully stop the servers
for _, srv := range a.servers {
err := srv.Stop(ctx)
if err != nil {
log.Printf("Server stop err: %v", err)
}
}
return nil
}