import (
"errors"
- "fmt"
)
var (
// reads to cease.
ErrTooManySegments = errors.New("too many segments")
)
-
-type errorBatch []error
-
-// ErrorBatch takes a possibly nil or empty list of errors, and if the list is
-// non-nil returns an error type that wraps all of the errors. Expected usage is
-// to append to an []errors and coerce the set to an error using this method.
-func ErrorBatch(errs []error) error {
- if len(errs) == 0 {
- return nil
- }
- return errorBatch(errs)
-}
-
-func (e errorBatch) Error() string {
- if len(e) == 0 {
- return ""
- }
- if len(e) == 1 {
- return e[0].Error()
- }
- return fmt.Sprintf("batch operation: %v (and %d more errors)", e[0], len(e)-1)
-}
-
-func (e errorBatch) Is(target error) bool {
- for _, err := range e {
- if errors.Is(err, target) {
- return true
- }
- }
- return false
-}
-
-func (e errorBatch) As(target interface{}) bool {
- for _, err := range e {
- if errors.As(err, target) {
- return true
- }
- }
- return false
-}
-
-func (e errorBatch) Unwrap() error {
- if len(e) == 0 {
- return nil
- }
- return e[0]
-}
tun.writeOpMu.Unlock()
}()
var (
- errs []error
+ errs error
total int
)
tun.toWrite = tun.toWrite[:0]
return total, os.ErrClosed
}
if err != nil {
- errs = append(errs, err)
+ errs = errors.Join(errs, err)
} else {
total += n
}
}
- return total, ErrorBatch(errs)
+ return total, errs
}
// handleVirtioRead splits in into bufs, leaving offset bytes at the front of