11package operations
22
33import (
4- . "github.com/parvez3019/go-swagger3/openApi3Schema"
5- "github.com/parvez3019/go-swagger3/parser/model"
6- "github.com/parvez3019/go-swagger3/parser/schema"
4+ "fmt"
75 "go/ast"
86 "strings"
7+
8+ "github.com/parvez3019/go-swagger3/openApi3Schema"
9+ "github.com/parvez3019/go-swagger3/parser/model"
10+ "github.com/parvez3019/go-swagger3/parser/schema"
911)
1012
1113type Parser interface {
1214 Parse (pkgPath , pkgName string , astComments []* ast.Comment ) error
1315}
1416
1517type parser struct {
16- OpenAPI * OpenAPIObject
18+ OpenAPI * openApi3Schema. OpenAPIObject
1719
1820 model.Utils
1921 schema.Parser
22+ usedOperationIds map [string ]struct {} // Track used operation IDs
2023}
2124
22- func NewParser (utils model.Utils , api * OpenAPIObject , schemaParser schema.Parser ) Parser {
25+ func NewParser (utils model.Utils , api * openApi3Schema. OpenAPIObject , schemaParser schema.Parser ) Parser {
2326 return & parser {
24- Utils : utils ,
25- OpenAPI : api ,
26- Parser : schemaParser ,
27+ Utils : utils ,
28+ OpenAPI : api ,
29+ Parser : schemaParser ,
30+ usedOperationIds : make (map [string ]struct {}),
2731 }
2832}
2933
3034func (p * parser ) Parse (pkgPath , pkgName string , astComments []* ast.Comment ) error {
31- operation := & OperationObject {Responses : map [string ]* ResponseObject {}}
35+ operation := & openApi3Schema. OperationObject {Responses : map [string ]* openApi3Schema. ResponseObject {}}
3236 if ! strings .HasPrefix (pkgPath , p .ModulePath ) || (p .HandlerPath != "" && ! strings .HasPrefix (pkgPath , p .HandlerPath )) {
3337 return nil
3438 }
@@ -45,7 +49,20 @@ func (p *parser) Parse(pkgPath, pkgName string, astComments []*ast.Comment) erro
4549 return nil
4650}
4751
48- func (p * parser ) parseOperationFromComment (pkgPath string , pkgName string , comment string , operation * OperationObject ) error {
52+ // validateOperationID checks if an operation ID is unique and registers it if it is.
53+ // Returns an error if the operation ID is already used.
54+ func (p * parser ) validateOperationID (operationID string ) error {
55+ if operationID == "" {
56+ return nil
57+ }
58+ if _ , exists := p .usedOperationIds [operationID ]; exists {
59+ return fmt .Errorf ("operation ID '%s' is not unique" , operationID )
60+ }
61+ p .usedOperationIds [operationID ] = struct {}{}
62+ return nil
63+ }
64+
65+ func (p * parser ) parseOperationFromComment (pkgPath string , pkgName string , comment string , operation * openApi3Schema.OperationObject ) error {
4966 attribute := strings .Fields (comment )[0 ]
5067 switch strings .ToLower (attribute ) {
5168 case "@title" :
@@ -62,6 +79,12 @@ func (p *parser) parseOperationFromComment(pkgPath string, pkgName string, comme
6279 p .parseResourceAndTag (comment , attribute , operation )
6380 case "@route" , "@router" :
6481 return p .parseRouteComment (operation , comment )
82+ case "@operationid" :
83+ operationID := strings .TrimSpace (comment [len (attribute ):])
84+ if err := p .validateOperationID (operationID ); err != nil {
85+ return err
86+ }
87+ operation .OperationID = operationID
6588 }
6689 return nil
6790}
0 commit comments