|  | 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) | 
|  | } |