| package gstruct | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"reflect" | 
 |  | 
 | 	"github.com/onsi/gomega/format" | 
 | 	"github.com/onsi/gomega/types" | 
 | ) | 
 |  | 
 | //PointTo applies the given matcher to the value pointed to by actual. It fails if the pointer is | 
 | //nil. | 
 | //  actual := 5 | 
 | //  Expect(&actual).To(PointTo(Equal(5))) | 
 | func PointTo(matcher types.GomegaMatcher) types.GomegaMatcher { | 
 | 	return &PointerMatcher{ | 
 | 		Matcher: matcher, | 
 | 	} | 
 | } | 
 |  | 
 | type PointerMatcher struct { | 
 | 	Matcher types.GomegaMatcher | 
 |  | 
 | 	// Failure message. | 
 | 	failure string | 
 | } | 
 |  | 
 | func (m *PointerMatcher) Match(actual interface{}) (bool, error) { | 
 | 	val := reflect.ValueOf(actual) | 
 |  | 
 | 	// return error if actual type is not a pointer | 
 | 	if val.Kind() != reflect.Ptr { | 
 | 		return false, fmt.Errorf("PointerMatcher expects a pointer but we have '%s'", val.Kind()) | 
 | 	} | 
 |  | 
 | 	if !val.IsValid() || val.IsNil() { | 
 | 		m.failure = format.Message(actual, "not to be <nil>") | 
 | 		return false, nil | 
 | 	} | 
 |  | 
 | 	// Forward the value. | 
 | 	elem := val.Elem().Interface() | 
 | 	match, err := m.Matcher.Match(elem) | 
 | 	if !match { | 
 | 		m.failure = m.Matcher.FailureMessage(elem) | 
 | 	} | 
 | 	return match, err | 
 | } | 
 |  | 
 | func (m *PointerMatcher) FailureMessage(_ interface{}) (message string) { | 
 | 	return m.failure | 
 | } | 
 |  | 
 | func (m *PointerMatcher) NegatedFailureMessage(actual interface{}) (message string) { | 
 | 	return m.Matcher.NegatedFailureMessage(actual) | 
 | } |