1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package app
- import (
- "context"
- "github.com/go-nunu/nunu-layout-advanced/pkg/server"
- "log"
- "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
- }
|