25 lines
580 B
Go
25 lines
580 B
Go
|
|
package cleanup
|
||
|
|
|
||
|
|
// Stack holds deferred cleanup functions and runs them in LIFO order.
|
||
|
|
// Errors are collected; one cleanup failure does not stop later ones.
|
||
|
|
type Stack struct {
|
||
|
|
fns []func() error
|
||
|
|
}
|
||
|
|
|
||
|
|
// Add registers fn to run on Run().
|
||
|
|
func (s *Stack) Add(fn func() error) {
|
||
|
|
s.fns = append(s.fns, fn)
|
||
|
|
}
|
||
|
|
|
||
|
|
// Run executes all registered functions in reverse order and returns
|
||
|
|
// every error produced.
|
||
|
|
func (s *Stack) Run() []error {
|
||
|
|
var errs []error
|
||
|
|
for i := len(s.fns) - 1; i >= 0; i-- {
|
||
|
|
if err := s.fns[i](); err != nil {
|
||
|
|
errs = append(errs, err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return errs
|
||
|
|
}
|