From 6548a907a6b8ab16be5737bb036c0b761922f4c6 Mon Sep 17 00:00:00 2001 From: Alvaro Frias Garay Date: Mon, 13 May 2024 18:41:34 -0300 Subject: [PATCH 1/2] add alias dict Signed-off-by: Alvaro Frias Garay --- parser/apis/parser.go | 2 ++ parser/apis/type_specs.go | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/parser/apis/parser.go b/parser/apis/parser.go index bead4fb..61d4ec3 100644 --- a/parser/apis/parser.go +++ b/parser/apis/parser.go @@ -18,6 +18,7 @@ type parser struct { model.Utils schemaParser schema.Parser operationParser operations.Parser + TypeAliases map[string]map[string]string // pkgName -> alias -> original } func NewParser(utils model.Utils, api *oas.OpenAPIObject, schemaParser schema.Parser) Parser { @@ -26,6 +27,7 @@ func NewParser(utils model.Utils, api *oas.OpenAPIObject, schemaParser schema.Pa OpenAPI: api, schemaParser: schemaParser, operationParser: operations.NewParser(utils, api, schemaParser), + TypeAliases: make(map[string]map[string]string), } } diff --git a/parser/apis/type_specs.go b/parser/apis/type_specs.go index fdc50fa..c09028c 100644 --- a/parser/apis/type_specs.go +++ b/parser/apis/type_specs.go @@ -30,10 +30,27 @@ func (p *parser) parseTypeSpecs() error { p.parseTypeSpecsFromPackage(astPackage, pkgName) } } + // After all type specifications have been parsed, resolve the type aliases + for pkgName, aliases := range p.TypeAliases { + for alias, original := range aliases { + if originalTypeSpec, ok := p.TypeSpecs[pkgName][original]; ok { + p.TypeSpecs[pkgName][alias] = originalTypeSpec + } + } + } return nil } +func (p *parser) parseTypeAlias(typeSpec *ast.TypeSpec, pkgName string) { + if ident, ok := typeSpec.Type.(*ast.Ident); ok { + if _, ok := p.TypeAliases[pkgName]; !ok { + p.TypeAliases[pkgName] = map[string]string{} + } + p.TypeAliases[pkgName][typeSpec.Name.String()] = ident.Name + } +} + func (p *parser) parseTypeSpecsFromPackage(astPackage *ast.Package, pkgName string) { for _, astFile := range astPackage.Files { p.parseTypeSpecsFromFile(astFile, pkgName) @@ -54,11 +71,11 @@ func (p *parser) parseTypeSpecFromDeclaration(astDeclaration ast.Decl, pkgName s } } -// parseTypeSpecFromGenDeclaration find type declaration func (p *parser) parseTypeSpecFromGenDeclaration(astGenDeclaration *ast.GenDecl, pkgName string) { for _, astSpec := range astGenDeclaration.Specs { if typeSpec, ok := astSpec.(*ast.TypeSpec); ok { p.TypeSpecs[pkgName][typeSpec.Name.String()] = typeSpec + p.parseTypeAlias(typeSpec, pkgName) } } } From d221446fb1cc6240021a6587d44a68f55bd80204 Mon Sep 17 00:00:00 2001 From: Alvaro Frias Garay Date: Tue, 14 May 2024 01:36:21 -0300 Subject: [PATCH 2/2] add test Signed-off-by: Alvaro Frias Garay --- integration_test/test_data/handler/restaurants.go | 5 ++++- integration_test/test_data/spec/expected.json | 4 ++-- integration_test/test_data/spec/expected_with_pkg.json | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/integration_test/test_data/handler/restaurants.go b/integration_test/test_data/handler/restaurants.go index 38f1d04..90d168c 100644 --- a/integration_test/test_data/handler/restaurants.go +++ b/integration_test/test_data/handler/restaurants.go @@ -26,7 +26,7 @@ func GetRestaurants() { // @param commodityGroup query string false "Use as filter.commodityGroup! Commodity Group" // @param isDigitalScreen query string false "Use as filter.isDigitalScreen! IsDigitalScreen. Can be: true, false" // @success 200 {object} GetPogsResponse -// @failure 400 {object} ValidationError +// @failure 400 {object} aliasValidationError // @failure 404 {object} ErrResponse // @failure 500 {object} ErrResponse // @route assortment/planogram [get] @@ -37,6 +37,9 @@ type GetPogsResponse struct { Planograms []int `json:"planograms"` } +// make a type alias of ValidationError +type aliasValidationError = ValidationError + type ValidationError struct { StatusCode int `json:"statusCode" xml:"statusCode"` Errors []error `json:"errors" xml:"errors"` diff --git a/integration_test/test_data/spec/expected.json b/integration_test/test_data/spec/expected.json index 164f6fc..1f614e5 100644 --- a/integration_test/test_data/spec/expected.json +++ b/integration_test/test_data/spec/expected.json @@ -183,7 +183,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/ValidationError" + "$ref": "#/components/schemas/aliasValidationError" } } } @@ -489,7 +489,7 @@ } } }, - "ValidationError": { + "aliasValidationError": { "type": "object", "properties": { "statusCode": { diff --git a/integration_test/test_data/spec/expected_with_pkg.json b/integration_test/test_data/spec/expected_with_pkg.json index b705487..4730f93 100644 --- a/integration_test/test_data/spec/expected_with_pkg.json +++ b/integration_test/test_data/spec/expected_with_pkg.json @@ -183,7 +183,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/github.com.parvez3019.go-swagger3.handler.ValidationError" + "$ref": "#/components/schemas/github.com.parvez3019.go-swagger3.handler.aliasValidationError" } } } @@ -382,7 +382,7 @@ } } }, - "github.com.parvez3019.go-swagger3.handler.ValidationError": { + "github.com.parvez3019.go-swagger3.handler.aliasValidationError": { "type": "object", "properties": { "statusCode": {