diff --git a/rdl/schemabuilder.go b/rdl/schemabuilder.go index 2091e54..2d95474 100644 --- a/rdl/schemabuilder.go +++ b/rdl/schemabuilder.go @@ -133,11 +133,13 @@ func (sb *SchemaBuilder) resolve(ordered []*Type, resolved map[string]bool, all case "struct": if t.StructTypeDef != nil { for _, f := range t.StructTypeDef.Fields { - res, err := sb.resolveRef(ordered, resolved, all, strings.ToLower(string(f.Type))) - if err != nil { - return nil, err + if strings.ToLower(string(f.Type)) != strings.ToLower(string(t.StructTypeDef.Name)) { + res, err := sb.resolveRef(ordered, resolved, all, strings.ToLower(string(f.Type))) + if err != nil { + return nil, err + } + ordered = res } - ordered = res } } default: diff --git a/rdl/schemabuilder_test.go b/rdl/schemabuilder_test.go index 2f42ce4..cef0ecc 100644 --- a/rdl/schemabuilder_test.go +++ b/rdl/schemabuilder_test.go @@ -176,3 +176,30 @@ func TestSBBaseTypeCaseSensitivity(test *testing.T) { }) } } + +func TestRecursiveStruct(t *testing.T) { + sb := NewSchemaBuilder("test") + tEmployee := NewStructTypeBuilder("Struct", "Employee") + tEmployee.Field("manager", "Employee", true, nil, "") + sb.AddType(tEmployee.Build()) + schema, err := sb.BuildParanoid() + if err != nil { + t.Errorf("build failed: %v", err) + } else { + found := false + for _, t := range schema.Types { + if t.StructTypeDef != nil { + if t.StructTypeDef.Name == TypeName("Employee") { + if Identifier("manager") == t.StructTypeDef.Fields[0].Name { + if t.StructTypeDef.Fields[0].Type == TypeRef("Employee") { + found = true + } + } + } + } + } + if !found { + t.Errorf("did not find recursive field manager") + } + } +}