2023-06-13 13:22:51 +00:00
|
|
|
package closer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
)
|
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
type Closer interface {
|
|
|
|
Close(ctx context.Context) error
|
2023-06-13 13:22:51 +00:00
|
|
|
}
|
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
type CloserFunc func(ctx context.Context) error
|
2023-06-13 13:22:51 +00:00
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
func (cf CloserFunc) Close(ctx context.Context) error {
|
|
|
|
return cf(ctx)
|
|
|
|
}
|
2023-06-13 13:22:51 +00:00
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
type CloserGroup struct {
|
|
|
|
closers []Closer
|
2023-06-13 13:22:51 +00:00
|
|
|
}
|
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
func NewCloserGroup() *CloserGroup {
|
|
|
|
return &CloserGroup{}
|
|
|
|
}
|
2023-06-13 13:22:51 +00:00
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
func (cg *CloserGroup) Add(c Closer) {
|
|
|
|
cg.closers = append(cg.closers, c)
|
|
|
|
}
|
2023-06-13 13:22:51 +00:00
|
|
|
|
2025-06-03 13:31:31 +00:00
|
|
|
func (cg *CloserGroup) Call(ctx context.Context) error {
|
|
|
|
var closeErr error
|
|
|
|
for i := len(cg.closers) - 1; i >= 0; i-- {
|
|
|
|
if err := cg.closers[i].Close(ctx); err != nil && closeErr == nil {
|
|
|
|
closeErr = err
|
2023-06-13 13:22:51 +00:00
|
|
|
}
|
|
|
|
}
|
2025-06-03 13:31:31 +00:00
|
|
|
return closeErr
|
2023-06-13 13:22:51 +00:00
|
|
|
}
|