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