diff --git a/generics_test.go b/generics_test.go index 9383e05f5..089e0d7df 100644 --- a/generics_test.go +++ b/generics_test.go @@ -31,8 +31,9 @@ func TestParseGenericsBasic(t *testing.T) { p := New() p.Overrides = map[string]string{ - "types.Field[string]": "string", - "types.DoubleField[string,string]": "string", + "types.Field[string]": "string", + "types.DoubleField[string,string]": "[]string", + "types.TrippleField[string,string]": "[][]string", } err = p.ParseAPI(searchDir, mainAPIFile, defaultParseDepth) diff --git a/operation.go b/operation.go index 71c4e47ca..86ffcf372 100644 --- a/operation.go +++ b/operation.go @@ -824,6 +824,10 @@ var responsePattern = regexp.MustCompile(`^([\w,]+)\s+([\w{}]+)\s+([\w\-.\\{}=,\ var combinedPattern = regexp.MustCompile(`^([\w\-./\[\]]+){(.*)}$`) func (operation *Operation) parseObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) { + return parseObjectSchema(operation.parser, refType, astFile) +} + +func parseObjectSchema(parser *Parser, refType string, astFile *ast.File) (*spec.Schema, error) { switch { case refType == NIL: return nil, nil @@ -838,7 +842,7 @@ func (operation *Operation) parseObjectSchema(refType string, astFile *ast.File) case IsPrimitiveType(refType): return PrimitiveSchema(refType), nil case strings.HasPrefix(refType, "[]"): - schema, err := operation.parseObjectSchema(refType[2:], astFile) + schema, err := parseObjectSchema(parser, refType[2:], astFile) if err != nil { return nil, err } @@ -856,17 +860,17 @@ func (operation *Operation) parseObjectSchema(refType string, astFile *ast.File) return spec.MapProperty(nil), nil } - schema, err := operation.parseObjectSchema(refType, astFile) + schema, err := parseObjectSchema(parser, refType, astFile) if err != nil { return nil, err } return spec.MapProperty(schema), nil case strings.Contains(refType, "{"): - return operation.parseCombinedObjectSchema(refType, astFile) + return parseCombinedObjectSchema(parser, refType, astFile) default: - if operation.parser != nil { // checking refType has existing in 'TypeDefinitions' - schema, err := operation.parser.getTypeSchema(refType, astFile, true) + if parser != nil { // checking refType has existing in 'TypeDefinitions' + schema, err := parser.getTypeSchema(refType, astFile, true) if err != nil { return nil, err } @@ -896,13 +900,13 @@ func parseFields(s string) []string { }) } -func (operation *Operation) parseCombinedObjectSchema(refType string, astFile *ast.File) (*spec.Schema, error) { +func parseCombinedObjectSchema(parser *Parser, refType string, astFile *ast.File) (*spec.Schema, error) { matches := combinedPattern.FindStringSubmatch(refType) if len(matches) != 3 { return nil, fmt.Errorf("invalid type: %s", refType) } - schema, err := operation.parseObjectSchema(matches[1], astFile) + schema, err := parseObjectSchema(parser, matches[1], astFile) if err != nil { return nil, err } @@ -912,7 +916,7 @@ func (operation *Operation) parseCombinedObjectSchema(refType string, astFile *a for _, field := range fields { keyVal := strings.SplitN(field, "=", 2) if len(keyVal) == 2 { - schema, err := operation.parseObjectSchema(keyVal[1], astFile) + schema, err := parseObjectSchema(parser, keyVal[1], astFile) if err != nil { return nil, err } diff --git a/parser.go b/parser.go index a47187989..63586217a 100644 --- a/parser.go +++ b/parser.go @@ -873,7 +873,7 @@ func convertFromSpecificToPrimitive(typeName string) (string, error) { func (parser *Parser) getTypeSchema(typeName string, file *ast.File, ref bool) (*spec.Schema, error) { if override, ok := parser.Overrides[typeName]; ok { parser.debug.Printf("Override detected for %s: using %s instead", typeName, override) - typeName = override + return parseObjectSchema(parser, override, file) } if IsInterfaceLike(typeName) { diff --git a/testdata/generics_basic/.swaggo b/testdata/generics_basic/.swaggo index 8c55f566d..30766d073 100644 --- a/testdata/generics_basic/.swaggo +++ b/testdata/generics_basic/.swaggo @@ -1,2 +1,3 @@ replace types.Field[string] string -replace types.DoubleField[string,string] string \ No newline at end of file +replace types.DoubleField[string,string] []string +replace types.TrippleField[string,string] [][]string \ No newline at end of file diff --git a/testdata/generics_basic/expected.json b/testdata/generics_basic/expected.json index 8124cc621..8f56bf54f 100644 --- a/testdata/generics_basic/expected.json +++ b/testdata/generics_basic/expected.json @@ -181,8 +181,20 @@ "types.Hello": { "type": "object", "properties": { + "myNewArrayField": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "string" + } + } + }, "myNewField": { - "type": "string" + "type": "array", + "items": { + "type": "string" + } }, "myStringField1": { "type": "string" diff --git a/testdata/generics_basic/types/string.go b/testdata/generics_basic/types/string.go index c7e251bc9..d90bcd1e7 100644 --- a/testdata/generics_basic/types/string.go +++ b/testdata/generics_basic/types/string.go @@ -9,8 +9,14 @@ type DoubleField[T1 any, T2 any] struct { Value2 T2 } +type TrippleField[T1 any, T2 any] struct { + Value1 T1 + Value2 T2 +} + type Hello struct { - MyStringField1 Field[*string] `json:"myStringField1"` - MyStringField2 Field[string] `json:"myStringField2"` - MyArrayField DoubleField[*string, string] `json:"myNewField"` + MyStringField1 Field[*string] `json:"myStringField1"` + MyStringField2 Field[string] `json:"myStringField2"` + MyArrayField DoubleField[*string, string] `json:"myNewField"` + MyArrayDepthField TrippleField[*string, string] `json:"myNewArrayField"` }