pkg/utils/shutdowner.go
Rama master · réplica de lectura del repositorio original.
package utils
import (
"context"
"github.com/hashicorp/go-multierror"
)
// NopShutdown implements the Shutdowner interface but does not execute any
// process on shutdown.
var NopShutdown = NewGroupShutdown()
// Shutdowner is an interface with a Shutdown method to gracefully shutdown
// a running process.
type Shutdowner interface {
Shutdown(ctx context.Context) error
}
// GroupShutdown allow to group multiple Shutdowner into a single one.
type GroupShutdown struct {
s []Shutdowner
}
// NewGroupShutdown returns a new GroupShutdown
func NewGroupShutdown(s ...Shutdowner) *GroupShutdown {
return &GroupShutdown{s}
}
// Shutdown closes all the encapsulated [Shutdowner] in parallel an returns
// the concatenated errors.
func (g *GroupShutdown) Shutdown(ctx context.Context) error {
errs := new(multierror.Group)
for _, s := range g.s {
// Shadow the variable to avoid a datarace
s := s
errs.Go(func() error { return s.Shutdown(ctx) })
}
return errs.Wait().ErrorOrNil()
}