customer/pkg/closer/closer.go

51 lines
847 B
Go
Raw Normal View History

2023-05-16 01:12:07 +00:00
package closer
import (
"context"
"fmt"
2023-05-17 20:27:09 +00:00
"log"
2023-05-16 01:12:07 +00:00
"sync"
)
type Callback func(ctx context.Context) error
type Closer struct {
mutex sync.Mutex
callbacks []Callback
}
2023-05-17 20:27:09 +00:00
func New() *Closer {
return &Closer{}
2023-05-16 01:12:07 +00:00
}
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 {
2023-05-17 20:27:09 +00:00
log.Printf("[! (%d)] %v", index, err)
2023-05-16 01:12:07 +00:00
}
}
complete <- struct{}{}
}()
select {
case <-complete:
return nil
case <-ctx.Done():
return fmt.Errorf("shutdown cancelled: %v", ctx.Err())
}
}