diff --git a/reference.go b/reference.go index 8318928..1e96f0b 100644 --- a/reference.go +++ b/reference.go @@ -52,6 +52,8 @@ func (r *Reference) ToJsonPointer() jsonpointer.Pointer { return r.jsonPointer } +var referenceType = reflect.TypeFor[Reference]() + func findRelativeJsonPointer(base reflect.Value, pointedField reflect.Value) jsonpointer.Pointer { for { if base.Equal(pointedField) { @@ -60,6 +62,9 @@ func findRelativeJsonPointer(base reflect.Value, pointedField reflect.Value) jso if resolver, isResolver := base.Interface().(JsonReferenceResolver); isResolver { return resolver.RelativeJsonPointer(pointedField.Interface()) } + if base.Type() == referenceType { // Don't recurse into other references + return nil + } if base.Kind() == reflect.Ptr || base.Kind() == reflect.Interface { if base.IsNil() { return nil diff --git a/reference_test.go b/reference_test.go index 5a4291d..372761d 100644 --- a/reference_test.go +++ b/reference_test.go @@ -10,6 +10,8 @@ import ( type testObject struct { ObjectHeader + Recursive *Reference + Substruct struct { SubField1 string `json:"subfield1" textlog:"subfield1"` } `json:"substruct" textlog:"substruct,expand"` @@ -89,6 +91,7 @@ func TestReference_ToJsonPointer(t *testing.T) { test.Valuer.Subfield6 = "subfield6" test.Valuer.Subfield7 = "subfield7" test.SubObject = &SubObject{Subfield8: "subfield8"} + test.Recursive = NewReference(&test, &test.Substruct) var tests = []struct { PointedField any