102 lines
2.7 KiB
Go
102 lines
2.7 KiB
Go
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
|
|
}
|