| package matchers | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"github.com/onsi/gomega/format" | 
 | 	"reflect" | 
 | ) | 
 |  | 
 | type HaveKeyMatcher struct { | 
 | 	Key interface{} | 
 | } | 
 |  | 
 | func (matcher *HaveKeyMatcher) Match(actual interface{}) (success bool, err error) { | 
 | 	if !isMap(actual) { | 
 | 		return false, fmt.Errorf("HaveKey matcher expects a map.  Got:%s", format.Object(actual, 1)) | 
 | 	} | 
 |  | 
 | 	keyMatcher, keyIsMatcher := matcher.Key.(omegaMatcher) | 
 | 	if !keyIsMatcher { | 
 | 		keyMatcher = &EqualMatcher{Expected: matcher.Key} | 
 | 	} | 
 |  | 
 | 	keys := reflect.ValueOf(actual).MapKeys() | 
 | 	for i := 0; i < len(keys); i++ { | 
 | 		success, err := keyMatcher.Match(keys[i].Interface()) | 
 | 		if err != nil { | 
 | 			return false, fmt.Errorf("HaveKey's key matcher failed with:\n%s%s", format.Indent, err.Error()) | 
 | 		} | 
 | 		if success { | 
 | 			return true, nil | 
 | 		} | 
 | 	} | 
 |  | 
 | 	return false, nil | 
 | } | 
 |  | 
 | func (matcher *HaveKeyMatcher) FailureMessage(actual interface{}) (message string) { | 
 | 	switch matcher.Key.(type) { | 
 | 	case omegaMatcher: | 
 | 		return format.Message(actual, "to have key matching", matcher.Key) | 
 | 	default: | 
 | 		return format.Message(actual, "to have key", matcher.Key) | 
 | 	} | 
 | } | 
 |  | 
 | func (matcher *HaveKeyMatcher) NegatedFailureMessage(actual interface{}) (message string) { | 
 | 	switch matcher.Key.(type) { | 
 | 	case omegaMatcher: | 
 | 		return format.Message(actual, "not to have key matching", matcher.Key) | 
 | 	default: | 
 | 		return format.Message(actual, "not to have key", matcher.Key) | 
 | 	} | 
 | } |