github.com/rzurga/go-swagger@v0.28.1-0.20211109195225-5d1f453ffa3a/cmd/swagger/commands/diff/difftypes.go (about) 1 package diff 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "log" 8 ) 9 10 // SpecChangeCode enumerates the various types of diffs from one spec to another 11 type SpecChangeCode int 12 13 const ( 14 // NoChangeDetected - the specs have no changes 15 NoChangeDetected SpecChangeCode = iota 16 // DeletedProperty - A message property has been deleted in the new spec 17 DeletedProperty 18 // AddedProperty - A message property has been added in the new spec 19 AddedProperty 20 // AddedRequiredProperty - A required message property has been added in the new spec 21 AddedRequiredProperty 22 // DeletedOptionalParam - An endpoint parameter has been deleted in the new spec 23 DeletedOptionalParam 24 // ChangedDescripton - Changed a description 25 ChangedDescripton 26 // AddedDescripton - Added a description 27 AddedDescripton 28 // DeletedDescripton - Deleted a description 29 DeletedDescripton 30 // ChangedTag - Changed a tag 31 ChangedTag 32 // AddedTag - Added a tag 33 AddedTag 34 // DeletedTag - Deleted a tag 35 DeletedTag 36 // DeletedResponse - An endpoint response has been deleted in the new spec 37 DeletedResponse 38 // DeletedEndpoint - An endpoint has been deleted in the new spec 39 DeletedEndpoint 40 // DeletedDeprecatedEndpoint - A deprecated endpoint has been deleted in the new spec 41 DeletedDeprecatedEndpoint 42 // AddedRequiredParam - A required parameter has been added in the new spec 43 AddedRequiredParam 44 // DeletedRequiredParam - A required parameter has been deleted in the new spec 45 DeletedRequiredParam 46 // AddedEndpoint - An endpoint has been added in the new spec 47 AddedEndpoint 48 // WidenedType - An type has been changed to a more permissive type eg int->string 49 WidenedType 50 // NarrowedType - An type has been changed to a less permissive type eg string->int 51 NarrowedType 52 // ChangedToCompatibleType - An type has been changed to a compatible type eg password->string 53 ChangedToCompatibleType 54 // ChangedType - An type has been changed to a type whose relative compatibility cannot be determined 55 ChangedType 56 // AddedEnumValue - An enum type has had a new potential value added to it 57 AddedEnumValue 58 // DeletedEnumValue - An enum type has had a existing value removed from it 59 DeletedEnumValue 60 // AddedOptionalParam - A new optional parameter has been added to the new spec 61 AddedOptionalParam 62 // ChangedOptionalToRequired - An optional parameter is now required in the new spec 63 ChangedOptionalToRequired 64 // ChangedRequiredToOptional - An required parameter is now optional in the new spec 65 ChangedRequiredToOptional 66 // AddedResponse An endpoint has new response code in the new spec 67 AddedResponse 68 // AddedConsumesFormat - a new consumes format (json/xml/yaml etc) has been added in the new spec 69 AddedConsumesFormat 70 // DeletedConsumesFormat - an existing format has been removed in the new spec 71 DeletedConsumesFormat 72 // AddedProducesFormat - a new produces format (json/xml/yaml etc) has been added in the new spec 73 AddedProducesFormat 74 // DeletedProducesFormat - an existing produces format has been removed in the new spec 75 DeletedProducesFormat 76 // AddedSchemes - a new scheme has been added to the new spec 77 AddedSchemes 78 // DeletedSchemes - a scheme has been removed from the new spec 79 DeletedSchemes 80 // ChangedHostURL - the host url has been changed. If this is used in the client generation, then clients will break. 81 ChangedHostURL 82 // ChangedBasePath - the host base path has been changed. If this is used in the client generation, then clients will break. 83 ChangedBasePath 84 // AddedResponseHeader Added a header Item 85 AddedResponseHeader 86 // ChangedResponseHeader Added a header Item 87 ChangedResponseHeader 88 // DeletedResponseHeader Added a header Item 89 DeletedResponseHeader 90 // RefTargetChanged Changed a ref to point to a different object 91 RefTargetChanged 92 // RefTargetRenamed Renamed a ref to point to the same object 93 RefTargetRenamed 94 // DeletedConstraint Deleted a schema constraint 95 DeletedConstraint 96 // AddedConstraint Added a schema constraint 97 AddedConstraint 98 // DeletedDefinition removed one of the definitions 99 DeletedDefinition 100 // AddedDefinition removed one of the definitions 101 AddedDefinition 102 ) 103 104 var toLongStringSpecChangeCode = map[SpecChangeCode]string{ 105 NoChangeDetected: "No Change detected", 106 AddedEndpoint: "Added endpoint", 107 DeletedEndpoint: "Deleted endpoint", 108 DeletedDeprecatedEndpoint: "Deleted a deprecated endpoint", 109 AddedRequiredProperty: "Added required property", 110 DeletedProperty: "Deleted property", 111 ChangedDescripton: "Changed a description", 112 AddedDescripton: "Added a description", 113 DeletedDescripton: "Deleted a description", 114 ChangedTag: "Changed a tag", 115 AddedTag: "Added a tag", 116 DeletedTag: "Deleted a tag", 117 AddedProperty: "Added property", 118 AddedOptionalParam: "Added optional param", 119 AddedRequiredParam: "Added required param", 120 DeletedOptionalParam: "Deleted optional param", 121 DeletedRequiredParam: "Deleted required param", 122 DeletedResponse: "Deleted response", 123 AddedResponse: "Added response", 124 WidenedType: "Widened type", 125 NarrowedType: "Narrowed type", 126 ChangedType: "Changed type", 127 ChangedToCompatibleType: "Changed type to equivalent type", 128 ChangedOptionalToRequired: "Changed optional param to required", 129 ChangedRequiredToOptional: "Changed required param to optional", 130 AddedEnumValue: "Added possible enumeration(s)", 131 DeletedEnumValue: "Deleted possible enumeration(s)", 132 AddedConsumesFormat: "Added a consumes format", 133 DeletedConsumesFormat: "Deleted a consumes format", 134 AddedProducesFormat: "Added produces format", 135 DeletedProducesFormat: "Deleted produces format", 136 AddedSchemes: "Added schemes", 137 DeletedSchemes: "Deleted schemes", 138 ChangedHostURL: "Changed host URL", 139 ChangedBasePath: "Changed base path", 140 AddedResponseHeader: "Added response header", 141 ChangedResponseHeader: "Changed response header", 142 DeletedResponseHeader: "Deleted response header", 143 RefTargetChanged: "Changed ref to different object", 144 RefTargetRenamed: "Changed ref to renamed object", 145 DeletedConstraint: "Deleted a schema constraint", 146 AddedConstraint: "Added a schema constraint", 147 DeletedDefinition: "Deleted a schema definition", 148 AddedDefinition: "Added a schema definition", 149 } 150 151 var toStringSpecChangeCode = map[SpecChangeCode]string{ 152 AddedEndpoint: "AddedEndpoint", 153 NoChangeDetected: "NoChangeDetected", 154 DeletedEndpoint: "DeletedEndpoint", 155 DeletedDeprecatedEndpoint: "DeletedDeprecatedEndpoint", 156 AddedRequiredProperty: "AddedRequiredProperty", 157 DeletedProperty: "DeletedProperty", 158 AddedProperty: "AddedProperty", 159 ChangedDescripton: "ChangedDescription", 160 AddedDescripton: "AddedDescription", 161 DeletedDescripton: "DeletedDescription", 162 ChangedTag: "ChangedTag", 163 AddedTag: "AddedTag", 164 DeletedTag: "DeletedTag", 165 AddedOptionalParam: "AddedOptionalParam", 166 AddedRequiredParam: "AddedRequiredParam", 167 DeletedOptionalParam: "DeletedRequiredParam", 168 DeletedRequiredParam: "Deleted required param", 169 DeletedResponse: "DeletedResponse", 170 AddedResponse: "AddedResponse", 171 WidenedType: "WidenedType", 172 NarrowedType: "NarrowedType", 173 ChangedType: "ChangedType", 174 ChangedToCompatibleType: "ChangedToCompatibleType", 175 ChangedOptionalToRequired: "ChangedOptionalToRequiredParam", 176 ChangedRequiredToOptional: "ChangedRequiredToOptionalParam", 177 AddedEnumValue: "AddedEnumValue", 178 DeletedEnumValue: "DeletedEnumValue", 179 AddedConsumesFormat: "AddedConsumesFormat", 180 DeletedConsumesFormat: "DeletedConsumesFormat", 181 AddedProducesFormat: "AddedProducesFormat", 182 DeletedProducesFormat: "DeletedProducesFormat", 183 AddedSchemes: "AddedSchemes", 184 DeletedSchemes: "DeletedSchemes", 185 ChangedHostURL: "ChangedHostURL", 186 ChangedBasePath: "ChangedBasePath", 187 AddedResponseHeader: "AddedResponseHeader", 188 ChangedResponseHeader: "ChangedResponseHeader", 189 DeletedResponseHeader: "DeletedResponseHeader", 190 RefTargetChanged: "RefTargetChanged", 191 RefTargetRenamed: "RefTargetRenamed", 192 DeletedConstraint: "DeletedConstraint", 193 AddedConstraint: "AddedConstraint", 194 DeletedDefinition: "DeletedDefinition", 195 AddedDefinition: "AddedDefinition", 196 } 197 198 var toIDSpecChangeCode = map[string]SpecChangeCode{} 199 200 // Description returns an english version of this error 201 func (s SpecChangeCode) Description() (result string) { 202 result, ok := toLongStringSpecChangeCode[s] 203 if !ok { 204 log.Printf("warning: No description for %v", s) 205 result = "UNDEFINED" 206 } 207 return 208 } 209 210 // MarshalJSON marshals the enum as a quoted json string 211 func (s SpecChangeCode) MarshalJSON() ([]byte, error) { 212 return stringAsQuotedBytes(toStringSpecChangeCode[s]) 213 } 214 215 // UnmarshalJSON unmashalls a quoted json string to the enum value 216 func (s *SpecChangeCode) UnmarshalJSON(b []byte) error { 217 str, err := readStringFromByteStream(b) 218 if err != nil { 219 return err 220 } 221 // Note that if the string cannot be found then it will return an error to the caller. 222 val, ok := toIDSpecChangeCode[str] 223 224 if ok { 225 *s = val 226 } else { 227 return fmt.Errorf("unknown enum value. cannot unmarshal '%s'", str) 228 } 229 return nil 230 } 231 232 // Compatibility - whether this is a breaking or non-breaking change 233 type Compatibility int 234 235 const ( 236 // Breaking this change could break existing clients 237 Breaking Compatibility = iota 238 // NonBreaking This is a backwards-compatible API change 239 NonBreaking 240 ) 241 242 func (s Compatibility) String() string { 243 return toStringCompatibility[s] 244 } 245 246 var toStringCompatibility = map[Compatibility]string{ 247 Breaking: "Breaking", 248 NonBreaking: "NonBreaking", 249 } 250 251 var toIDCompatibility = map[string]Compatibility{} 252 253 // MarshalJSON marshals the enum as a quoted json string 254 func (s Compatibility) MarshalJSON() ([]byte, error) { 255 return stringAsQuotedBytes(toStringCompatibility[s]) 256 } 257 258 // UnmarshalJSON unmashals a quoted json string to the enum value 259 func (s *Compatibility) UnmarshalJSON(b []byte) error { 260 str, err := readStringFromByteStream(b) 261 if err != nil { 262 return err 263 } 264 // Note that if the string cannot be found then it will return an error to the caller. 265 val, ok := toIDCompatibility[str] 266 267 if ok { 268 *s = val 269 } else { 270 return fmt.Errorf("unknown enum value. cannot unmarshal '%s'", str) 271 } 272 return nil 273 } 274 275 func stringAsQuotedBytes(str string) ([]byte, error) { 276 buffer := bytes.NewBufferString(`"`) 277 buffer.WriteString(str) 278 buffer.WriteString(`"`) 279 return buffer.Bytes(), nil 280 } 281 282 func readStringFromByteStream(b []byte) (string, error) { 283 var j string 284 err := json.Unmarshal(b, &j) 285 if err != nil { 286 return "", err 287 } 288 return j, nil 289 } 290 291 func init() { 292 for key, val := range toStringSpecChangeCode { 293 toIDSpecChangeCode[val] = key 294 } 295 for key, val := range toStringCompatibility { 296 toIDCompatibility[val] = key 297 } 298 }