package openapi3 import ( "context" "errors" "strconv" "github.com/getkin/kin-openapi/jsoninfo" ) // Operation represents "operation" specified by" OpenAPI/Swagger 3.0 standard. type Operation struct { ExtensionProps // Optional tags for documentation. Tags []string `json:"tags,omitempty" yaml:"tags,omitempty"` // Optional short summary. Summary string `json:"summary,omitempty" yaml:"summary,omitempty"` // Optional description. Should use CommonMark syntax. Description string `json:"description,omitempty" yaml:"description,omitempty"` // Optional operation ID. OperationID string `json:"operationId,omitempty" yaml:"operationId,omitempty"` // Optional parameters. Parameters Parameters `json:"parameters,omitempty" yaml:"parameters,omitempty"` // Optional body parameter. RequestBody *RequestBodyRef `json:"requestBody,omitempty" yaml:"requestBody,omitempty"` // Responses. Responses Responses `json:"responses" yaml:"responses"` // Required // Optional callbacks Callbacks map[string]*CallbackRef `json:"callbacks,omitempty" yaml:"callbacks,omitempty"` Deprecated bool `json:"deprecated,omitempty" yaml:"deprecated,omitempty"` // Optional security requirements that overrides top-level security. Security *SecurityRequirements `json:"security,omitempty" yaml:"security,omitempty"` // Optional servers that overrides top-level servers. Servers *Servers `json:"servers,omitempty" yaml:"servers,omitempty"` ExternalDocs *ExternalDocs `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"` } func NewOperation() *Operation { return &Operation{} } func (operation *Operation) MarshalJSON() ([]byte, error) { return jsoninfo.MarshalStrictStruct(operation) } func (operation *Operation) UnmarshalJSON(data []byte) error { return jsoninfo.UnmarshalStrictStruct(data, operation) } func (operation *Operation) AddParameter(p *Parameter) { operation.Parameters = append(operation.Parameters, &ParameterRef{ Value: p, }) } func (operation *Operation) AddResponse(status int, response *Response) { responses := operation.Responses if responses == nil { responses = NewResponses() operation.Responses = responses } code := "default" if status != 0 { code = strconv.FormatInt(int64(status), 10) } responses[code] = &ResponseRef{ Value: response, } } func (operation *Operation) Validate(c context.Context) error { if v := operation.Parameters; v != nil { if err := v.Validate(c); err != nil { return err } } if v := operation.RequestBody; v != nil { if err := v.Validate(c); err != nil { return err } } if v := operation.Responses; v != nil { if err := v.Validate(c); err != nil { return err } } else { return errors.New("value of responses must be a JSON object") } return nil }