github.com/onsi/gomega@v1.32.0/gstruct/errors/nested_types.go (about)

     1  package errors
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/onsi/gomega/types"
     8  )
     9  
    10  // A stateful matcher that nests other matchers within it and preserves the error types of the
    11  // nested matcher failures.
    12  type NestingMatcher interface {
    13  	types.GomegaMatcher
    14  
    15  	// Returns the failures of nested matchers.
    16  	Failures() []error
    17  }
    18  
    19  // An error type for labeling errors on deeply nested matchers.
    20  type NestedError struct {
    21  	Path string
    22  	Err  error
    23  }
    24  
    25  func (e *NestedError) Error() string {
    26  	// Indent Errors.
    27  	indented := strings.Replace(e.Err.Error(), "\n", "\n\t", -1)
    28  	return fmt.Sprintf("%s:\n\t%v", e.Path, indented)
    29  }
    30  
    31  // Create a NestedError with the given path.
    32  // If err is a NestedError, prepend the path to it.
    33  // If err is an AggregateError, recursively Nest each error.
    34  func Nest(path string, err error) error {
    35  	if ag, ok := err.(AggregateError); ok {
    36  		var errs AggregateError
    37  		for _, e := range ag {
    38  			errs = append(errs, Nest(path, e))
    39  		}
    40  		return errs
    41  	}
    42  	if ne, ok := err.(*NestedError); ok {
    43  		return &NestedError{
    44  			Path: path + ne.Path,
    45  			Err:  ne.Err,
    46  		}
    47  	}
    48  	return &NestedError{
    49  		Path: path,
    50  		Err:  err,
    51  	}
    52  }
    53  
    54  // An error type for treating multiple errors as a single error.
    55  type AggregateError []error
    56  
    57  // Error is part of the error interface.
    58  func (err AggregateError) Error() string {
    59  	if len(err) == 0 {
    60  		// This should never happen, really.
    61  		return ""
    62  	}
    63  	if len(err) == 1 {
    64  		return err[0].Error()
    65  	}
    66  	result := fmt.Sprintf("[%s", err[0].Error())
    67  	for i := 1; i < len(err); i++ {
    68  		result += fmt.Sprintf(", %s", err[i].Error())
    69  	}
    70  	result += "]"
    71  	return result
    72  }