customer/pkg/closer/closer.go

53 lines
944 B
Go
Raw Normal View History

2023-05-16 01:12:07 +00:00
package closer
import (
"context"
"fmt"
"sync"
"github.com/sirupsen/logrus"
)
type Callback func(ctx context.Context) error
type Closer struct {
mutex sync.Mutex
callbacks []Callback
logger *logrus.Logger
}
func New(logger *logrus.Logger) *Closer {
return &Closer{logger: logger}
}
func (receiver *Closer) Add(callback Callback) {
receiver.mutex.Lock()
defer receiver.mutex.Unlock()
receiver.callbacks = append(receiver.callbacks, callback)
}
func (receiver *Closer) Close(ctx context.Context) error {
receiver.mutex.Lock()
defer receiver.mutex.Unlock()
complete := make(chan struct{}, 1)
go func() {
for index, callback := range receiver.callbacks {
if err := callback(ctx); err != nil {
receiver.logger.Errorf("[! (%d)] %v", index, err)
}
}
complete <- struct{}{}
}()
select {
case <-complete:
return nil
case <-ctx.Done():
return fmt.Errorf("shutdown cancelled: %v", ctx.Err())
}
}