forked from Tufin/oasdiff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
method_diff.go
123 lines (100 loc) · 4.48 KB
/
method_diff.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package diff
import (
"github.com/rjmohammad/kin-openapi/openapi3"
)
// MethodDiff describes the changes between a pair of operation objects: https://swagger.io/specification/#operation-object
type MethodDiff struct {
ExtensionsDiff *ExtensionsDiff `json:"extensions,omitempty" yaml:"extensions,omitempty"`
TagsDiff *StringsDiff `json:"tags,omitempty" yaml:"tags,omitempty"`
SummaryDiff *ValueDiff `json:"summary,omitempty" yaml:"summary,omitempty"`
DescriptionDiff *ValueDiff `json:"description,omitempty" yaml:"description,omitempty"`
OperationIDDiff *ValueDiff `json:"operationID,omitempty" yaml:"operationID,omitempty"`
ParametersDiff *ParametersDiff `json:"parameters,omitempty" yaml:"parameters,omitempty"`
RequestBodyDiff *RequestBodyDiff `json:"requestBody,omitempty" yaml:"requestBody,omitempty"`
ResponsesDiff *ResponsesDiff `json:"responses,omitempty" yaml:"responses,omitempty"`
CallbacksDiff *CallbacksDiff `json:"callbacks,omitempty" yaml:"callbacks,omitempty"`
DeprecatedDiff *ValueDiff `json:"deprecated,omitempty" yaml:"deprecated,omitempty"`
SecurityDiff *SecurityRequirementsDiff `json:"securityRequirements,omitempty" yaml:"securityRequirements,omitempty"`
ServersDiff *ServersDiff `json:"servers,omitempty" yaml:"servers,omitempty"`
ExternalDocsDiff *ExternalDocsDiff `json:"externalDocs,omitempty" yaml:"externalDocs,omitempty"`
}
func newMethodDiff() *MethodDiff {
return &MethodDiff{}
}
// Empty indicates whether a change was found in this element
func (methodDiff *MethodDiff) Empty() bool {
if methodDiff == nil {
return true
}
return *methodDiff == MethodDiff{}
}
func (methodDiff *MethodDiff) removeNonBreaking(config *Config, pathItem2 *openapi3.Operation) {
if methodDiff.Empty() {
return
}
methodDiff.ExtensionsDiff = nil
methodDiff.TagsDiff = nil
methodDiff.SummaryDiff = nil
methodDiff.DescriptionDiff = nil
methodDiff.OperationIDDiff = nil
if deprecationPeriodSufficient(config.DeprecationDays, pathItem2.ExtensionProps) {
methodDiff.DeprecatedDiff = nil
}
methodDiff.ServersDiff = nil
methodDiff.ExternalDocsDiff = nil
}
func getMethodDiff(config *Config, state *state, pathItem1, pathItem2 *openapi3.Operation) (*MethodDiff, error) {
diff, err := getMethodDiffInternal(config, state, pathItem1, pathItem2)
if err != nil {
return nil, err
}
if config.BreakingOnly {
diff.removeNonBreaking(config, pathItem2)
}
if diff.Empty() {
return nil, nil
}
return diff, nil
}
func getMethodDiffInternal(config *Config, state *state, pathItem1, pathItem2 *openapi3.Operation) (*MethodDiff, error) {
result := newMethodDiff()
var err error
result.ExtensionsDiff = getExtensionsDiff(config, state, pathItem1.ExtensionProps, pathItem2.ExtensionProps)
result.TagsDiff = getStringsDiff(pathItem1.Tags, pathItem2.Tags)
result.SummaryDiff = getValueDiff(pathItem1.Summary, pathItem2.Summary)
result.DescriptionDiff = getValueDiffConditional(config.ExcludeDescription, pathItem1.Description, pathItem2.Description)
result.OperationIDDiff = getValueDiff(pathItem1.OperationID, pathItem2.OperationID)
result.ParametersDiff, err = getParametersDiff(config, state, pathItem1.Parameters, pathItem2.Parameters)
if err != nil {
return nil, err
}
result.RequestBodyDiff, err = getRequestBodyDiff(config, state, pathItem1.RequestBody, pathItem2.RequestBody)
if err != nil {
return nil, err
}
result.ResponsesDiff, err = getResponsesDiff(config, state, pathItem1.Responses, pathItem2.Responses)
if err != nil {
return nil, err
}
result.CallbacksDiff, err = getCallbacksDiff(config, state, pathItem1.Callbacks, pathItem2.Callbacks)
if err != nil {
return nil, err
}
result.DeprecatedDiff = getValueDiff(pathItem1.Deprecated, pathItem2.Deprecated)
result.SecurityDiff = getSecurityRequirementsDiff(config, state, pathItem1.Security, pathItem2.Security)
result.ServersDiff = getServersDiff(config, state, pathItem1.Servers, pathItem2.Servers)
result.ExternalDocsDiff = getExternalDocsDiff(config, state, pathItem1.ExternalDocs, pathItem2.ExternalDocs)
return result, nil
}
// Patch applies the patch to a method
func (methodDiff *MethodDiff) Patch(operation *openapi3.Operation) error {
if methodDiff.Empty() {
return nil
}
methodDiff.DescriptionDiff.patchString(&operation.Description)
err := methodDiff.ParametersDiff.Patch(operation.Parameters)
if err != nil {
return err
}
return nil
}