github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xerrors/join.go (about)

     1  package xerrors
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xslices"
     7  	"github.com/ydb-platform/ydb-go-sdk/v3/internal/xstring"
     8  )
     9  
    10  func Join(errs ...error) error {
    11  	errs = xslices.Filter(errs, func(err error) bool {
    12  		return err != nil
    13  	})
    14  
    15  	switch len(errs) {
    16  	case 0:
    17  		return nil
    18  	case 1:
    19  		return errs[0]
    20  	default:
    21  		return &joinError{
    22  			errs: errs,
    23  		}
    24  	}
    25  }
    26  
    27  type joinError struct {
    28  	errs []error
    29  }
    30  
    31  func (e *joinError) Error() string {
    32  	b := xstring.Buffer()
    33  	defer b.Free()
    34  	b.WriteByte('[')
    35  	for i, err := range e.errs {
    36  		if i > 0 {
    37  			_ = b.WriteByte(',')
    38  		}
    39  		_, _ = fmt.Fprintf(b, "%q", err.Error())
    40  	}
    41  	b.WriteByte(']')
    42  
    43  	return b.String()
    44  }
    45  
    46  func (e *joinError) As(target interface{}) bool {
    47  	for _, err := range e.errs {
    48  		if As(err, target) {
    49  			return true
    50  		}
    51  	}
    52  
    53  	return false
    54  }
    55  
    56  func (e *joinError) Is(target error) bool {
    57  	for _, err := range e.errs {
    58  		if Is(err, target) {
    59  			return true
    60  		}
    61  	}
    62  
    63  	return false
    64  }
    65  
    66  func (e *joinError) Unwrap() []error {
    67  	return e.errs
    68  }