| package matchers | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"reflect" | 
 |  | 
 | 	"github.com/onsi/gomega/format" | 
 | ) | 
 |  | 
 | type ContainElementMatcher struct { | 
 | 	Element interface{} | 
 | } | 
 |  | 
 | func (matcher *ContainElementMatcher) Match(actual interface{}) (success bool, err error) { | 
 | 	if !isArrayOrSlice(actual) && !isMap(actual) { | 
 | 		return false, fmt.Errorf("ContainElement matcher expects an array/slice/map.  Got:\n%s", format.Object(actual, 1)) | 
 | 	} | 
 |  | 
 | 	elemMatcher, elementIsMatcher := matcher.Element.(omegaMatcher) | 
 | 	if !elementIsMatcher { | 
 | 		elemMatcher = &EqualMatcher{Expected: matcher.Element} | 
 | 	} | 
 |  | 
 | 	value := reflect.ValueOf(actual) | 
 | 	var keys []reflect.Value | 
 | 	if isMap(actual) { | 
 | 		keys = value.MapKeys() | 
 | 	} | 
 | 	var lastError error | 
 | 	for i := 0; i < value.Len(); i++ { | 
 | 		var success bool | 
 | 		var err error | 
 | 		if isMap(actual) { | 
 | 			success, err = elemMatcher.Match(value.MapIndex(keys[i]).Interface()) | 
 | 		} else { | 
 | 			success, err = elemMatcher.Match(value.Index(i).Interface()) | 
 | 		} | 
 | 		if err != nil { | 
 | 			lastError = err | 
 | 			continue | 
 | 		} | 
 | 		if success { | 
 | 			return true, nil | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return false, lastError | 
 | } | 
 |  | 
 | func (matcher *ContainElementMatcher) FailureMessage(actual interface{}) (message string) { | 
 | 	return format.Message(actual, "to contain element matching", matcher.Element) | 
 | } | 
 |  | 
 | func (matcher *ContainElementMatcher) NegatedFailureMessage(actual interface{}) (message string) { | 
 | 	return format.Message(actual, "not to contain element matching", matcher.Element) | 
 | } |