Files
libopenapi/what-changed/model/components.go
Dave Shanley 1abc25a923 Added component checking for swagger models.
components support now caters to v2, v3 coming shortly - but now it's time for a walk. this shit is exhausting my brain.
2022-11-18 11:00:34 -05:00

144 lines
4.3 KiB
Go

// Copyright 2022 Princess B33f Heavy Industries / Dave Shanley
// SPDX-License-Identifier: MIT
package model
import (
v2 "github.com/pb33f/libopenapi/datamodel/low/v2"
v3 "github.com/pb33f/libopenapi/datamodel/low/v3"
"reflect"
)
type ComponentsChanges struct {
PropertyChanges
SchemaChanges map[string]*SchemaChanges
ResponsesChanges map[string]*ResponseChanges
ParameterChanges map[string]*ParameterChanges
ExamplesChanges map[string]*ExamplesChanges
RequestBodyChanges map[string]*RequestBodyChanges
HeaderChanges map[string]*HeaderChanges
SecuritySchemeChanges map[string]*SecuritySchemeChanges
LinkChanges map[string]*LinkChanges
CallbackChanges map[string]*CallbackChanges
ExtensionChanges *ExtensionChanges
}
func CompareComponents(l, r any) *ComponentsChanges {
var changes []*Change
cc := new(ComponentsChanges)
// Swagger Parameters
if reflect.TypeOf(&v2.ParameterDefinitions{}) == reflect.TypeOf(l) &&
reflect.TypeOf(&v2.ParameterDefinitions{}) == reflect.TypeOf(r) {
lDef := l.(*v2.ParameterDefinitions)
rDef := r.(*v2.ParameterDefinitions)
cc.ParameterChanges = CheckMapForChangesUntyped(lDef.Definitions, rDef.Definitions, &changes,
v3.ParametersLabel, CompareParameters)
}
// Swagger Responses
if reflect.TypeOf(&v2.ResponsesDefinitions{}) == reflect.TypeOf(l) &&
reflect.TypeOf(&v2.ResponsesDefinitions{}) == reflect.TypeOf(r) {
lDef := l.(*v2.ResponsesDefinitions)
rDef := r.(*v2.ResponsesDefinitions)
cc.ResponsesChanges = CheckMapForChangesUntyped(lDef.Definitions, rDef.Definitions, &changes,
v3.ResponsesLabel, CompareResponse)
}
// Swagger Schemas
if reflect.TypeOf(&v2.Definitions{}) == reflect.TypeOf(l) &&
reflect.TypeOf(&v2.Definitions{}) == reflect.TypeOf(r) {
lDef := l.(*v2.Definitions)
rDef := r.(*v2.Definitions)
cc.SchemaChanges = CheckMapForChanges(lDef.Schemas, rDef.Schemas, &changes,
v2.DefinitionsLabel, CompareSchemas)
}
// Swagger Security Definitions
if reflect.TypeOf(&v2.SecurityDefinitions{}) == reflect.TypeOf(l) &&
reflect.TypeOf(&v2.SecurityDefinitions{}) == reflect.TypeOf(r) {
lDef := l.(*v2.SecurityDefinitions)
rDef := r.(*v2.SecurityDefinitions)
cc.SecuritySchemeChanges = CheckMapForChangesUntyped(lDef.Definitions, rDef.Definitions, &changes,
v3.SecurityDefinitionLabel, CompareSecuritySchemes)
}
cc.Changes = changes
if cc.TotalChanges() <= 0 {
return nil
}
return cc
}
func (c *ComponentsChanges) TotalChanges() int {
v := c.PropertyChanges.TotalChanges()
for k := range c.SchemaChanges {
v += c.SchemaChanges[k].TotalChanges()
}
for k := range c.ResponsesChanges {
v += c.ResponsesChanges[k].TotalChanges()
}
for k := range c.ParameterChanges {
v += c.ParameterChanges[k].TotalChanges()
}
for k := range c.ExamplesChanges {
v += c.ExamplesChanges[k].TotalChanges()
}
for k := range c.RequestBodyChanges {
v += c.RequestBodyChanges[k].TotalChanges()
}
for k := range c.HeaderChanges {
v += c.HeaderChanges[k].TotalChanges()
}
for k := range c.SecuritySchemeChanges {
v += c.SecuritySchemeChanges[k].TotalChanges()
}
for k := range c.LinkChanges {
v += c.LinkChanges[k].TotalChanges()
}
for k := range c.CallbackChanges {
v += c.CallbackChanges[k].TotalChanges()
}
if c.ExtensionChanges != nil {
v += c.ExtensionChanges.TotalChanges()
}
return v
}
func (c *ComponentsChanges) TotalBreakingChanges() int {
v := c.PropertyChanges.TotalBreakingChanges()
for k := range c.SchemaChanges {
v += c.SchemaChanges[k].TotalBreakingChanges()
}
for k := range c.ResponsesChanges {
v += c.ResponsesChanges[k].TotalBreakingChanges()
}
for k := range c.ParameterChanges {
v += c.ParameterChanges[k].TotalBreakingChanges()
}
for k := range c.ExamplesChanges {
v += c.ExamplesChanges[k].TotalBreakingChanges()
}
for k := range c.RequestBodyChanges {
v += c.RequestBodyChanges[k].TotalBreakingChanges()
}
for k := range c.HeaderChanges {
v += c.HeaderChanges[k].TotalBreakingChanges()
}
for k := range c.SecuritySchemeChanges {
v += c.SecuritySchemeChanges[k].TotalBreakingChanges()
}
for k := range c.LinkChanges {
v += c.LinkChanges[k].TotalBreakingChanges()
}
for k := range c.CallbackChanges {
v += c.CallbackChanges[k].TotalBreakingChanges()
}
if c.ExtensionChanges != nil {
v += c.ExtensionChanges.TotalBreakingChanges()
}
return v
}