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