rclone/lib/errcount/errcount.go
2024-02-22 11:13:54 +00:00

58 lines
1.1 KiB
Go

// Package errcount provides an easy to use error counter which
// returns error count and last error so as to not overwhelm the user
// with errors.
package errcount
import (
"fmt"
"sync"
)
// ErrCount stores the state of the error counter.
type ErrCount struct {
mu sync.Mutex
lastErr error
count int
}
// New makes a new error counter
func New() *ErrCount {
return new(ErrCount)
}
// Add an error to the error count.
//
// err may be nil.
//
// Thread safe.
func (ec *ErrCount) Add(err error) {
if err == nil {
return
}
ec.mu.Lock()
ec.count++
ec.lastErr = err
ec.mu.Unlock()
}
// Err returns the error summary so far - may be nil
//
// txt is put in front of the error summary
//
// txt: %d errors: last error: %w
//
// or this if only one error
//
// txt: %w
//
// Thread safe.
func (ec *ErrCount) Err(txt string) error {
ec.mu.Lock()
defer ec.mu.Unlock()
if ec.count == 0 {
return nil
} else if ec.count == 1 {
return fmt.Errorf("%s: %w", txt, ec.lastErr)
}
return fmt.Errorf("%s: %d errors: last error: %w", txt, ec.count, ec.lastErr)
}