Skip to content

Commit

Permalink
Addressed panic reported in #86
Browse files Browse the repository at this point in the history
Signed-off-by: quobix <[email protected]>

Addressed panic reported in #86

Addressed #63 (increased canvas manually for now)

Signed-off-by: quobix <[email protected]>
  • Loading branch information
daveshanley committed Jan 19, 2024
1 parent b6a14e4 commit eaf0303
Show file tree
Hide file tree
Showing 11 changed files with 982 additions and 1,053 deletions.
272 changes: 137 additions & 135 deletions builder/graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,183 +43,185 @@ func exploreGraphObject(parent *model.NodeData[any], object any, nodes *[]*model
edges *[]*model.EdgeData[any]) {

v := reflect.ValueOf(object).Elem()
num := v.NumField()

for i := 0; i < num; i++ {
height := LeafHeight
width := DefaultWidth
fName := v.Type().Field(i).Name
field := v.FieldByName(fName)
if !field.IsZero() {
switch field.Type() {
case reflect.TypeOf(&wcModel.PropertyChanges{}):

topChanges := field.Elem().Interface().(wcModel.PropertyChanges).Changes

for x := range topChanges {
newWidth := calcWidth(topChanges[x].New)
origWidth := calcWidth(topChanges[x].Original)
if (newWidth > origWidth) && (newWidth > width) {
width = newWidth
}
if (newWidth < origWidth) && (origWidth > width) {
width = origWidth
}
if width > MaxWidth {
width = MaxWidth // time to truncate, this is too wide.
}
if v.IsValid() && !v.IsZero() {
num := v.NumField()

for i := 0; i < num; i++ {
height := LeafHeight
width := DefaultWidth
fName := v.Type().Field(i).Name
field := v.FieldByName(fName)
if !field.IsZero() {
switch field.Type() {
case reflect.TypeOf(&wcModel.PropertyChanges{}):

topChanges := field.Elem().Interface().(wcModel.PropertyChanges).Changes

for x := range topChanges {
newWidth := calcWidth(topChanges[x].New)
origWidth := calcWidth(topChanges[x].Original)
if (newWidth > origWidth) && (newWidth > width) {
width = newWidth
}
if (newWidth < origWidth) && (origWidth > width) {
width = origWidth
}
if width > MaxWidth {
width = MaxWidth // time to truncate, this is too wide.
}

// shrink if there are no values to show
if topChanges[x].New == "" && topChanges[x].Original == "" {
height = DefaultHeight + 2 // add a little extra because borders are thick.
}
// shrink if there are no values to show
if topChanges[x].New == "" && topChanges[x].Original == "" {
height = DefaultHeight + 2 // add a little extra because borders are thick.
}

n := buildNode(topChanges[x].Property, width, height, topChanges[x])
if parent != nil {
e := &model.EdgeData[any]{
Id: fmt.Sprintf("%s-to-%s", parent.Id, n.Id),
From: parent.Id,
To: n.Id,
n := buildNode(topChanges[x].Property, width, height, topChanges[x])
if parent != nil {
e := &model.EdgeData[any]{
Id: fmt.Sprintf("%s-to-%s", parent.Id, n.Id),
From: parent.Id,
To: n.Id,
}
*edges = append(*edges, e)
}
*edges = append(*edges, e)
*nodes = append(*nodes, n)
}
*nodes = append(*nodes, n)
}
continue
continue

case reflect.TypeOf(&wcModel.InfoChanges{}):
DigIntoObject[wcModel.InfoChanges](parent, field, nodes, upper.String(v3.InfoLabel), edges)
case reflect.TypeOf(&wcModel.InfoChanges{}):
DigIntoObject[wcModel.InfoChanges](parent, field, nodes, upper.String(v3.InfoLabel), edges)

case reflect.TypeOf(&wcModel.ContactChanges{}):
DigIntoObject[wcModel.ContactChanges](parent, field, nodes, upper.String(v3.ContactLabel), edges)
case reflect.TypeOf(&wcModel.ContactChanges{}):
DigIntoObject[wcModel.ContactChanges](parent, field, nodes, upper.String(v3.ContactLabel), edges)

case reflect.TypeOf(&wcModel.ItemsChanges{}):
DigIntoObject[wcModel.ItemsChanges](parent, field, nodes, upper.String(v3.ItemsLabel), edges)
case reflect.TypeOf(&wcModel.ItemsChanges{}):
DigIntoObject[wcModel.ItemsChanges](parent, field, nodes, upper.String(v3.ItemsLabel), edges)

case reflect.TypeOf(&wcModel.LicenseChanges{}):
DigIntoObject[wcModel.LicenseChanges](parent, field, nodes, upper.String(v3.LicenseLabel), edges)
case reflect.TypeOf(&wcModel.LicenseChanges{}):
DigIntoObject[wcModel.LicenseChanges](parent, field, nodes, upper.String(v3.LicenseLabel), edges)

case reflect.TypeOf(&wcModel.PathsChanges{}):
DigIntoObject[wcModel.PathsChanges](parent, field, nodes, upper.String(v3.PathsLabel), edges)
case reflect.TypeOf(&wcModel.PathsChanges{}):
DigIntoObject[wcModel.PathsChanges](parent, field, nodes, upper.String(v3.PathsLabel), edges)

case reflect.TypeOf(&wcModel.OperationChanges{}):
DigIntoObject[wcModel.OperationChanges](parent, field, nodes,
strings.ToUpper(strings.ReplaceAll(fName, "Changes", "")), edges)
case reflect.TypeOf(&wcModel.OperationChanges{}):
DigIntoObject[wcModel.OperationChanges](parent, field, nodes,
strings.ToUpper(strings.ReplaceAll(fName, "Changes", "")), edges)

case reflect.TypeOf(&wcModel.ServerChanges{}):
DigIntoObject[wcModel.ServerChanges](parent, field, nodes, upper.String(v3.ServerLabel), edges)
case reflect.TypeOf(&wcModel.ServerChanges{}):
DigIntoObject[wcModel.ServerChanges](parent, field, nodes, upper.String(v3.ServerLabel), edges)

case reflect.TypeOf(&wcModel.ComponentsChanges{}):
DigIntoObject[wcModel.ComponentsChanges](parent, field, nodes, upper.String(v3.ComponentsLabel), edges)
case reflect.TypeOf(&wcModel.ComponentsChanges{}):
DigIntoObject[wcModel.ComponentsChanges](parent, field, nodes, upper.String(v3.ComponentsLabel), edges)

case reflect.TypeOf(&wcModel.RequestBodyChanges{}):
DigIntoObject[wcModel.RequestBodyChanges](parent, field, nodes, upper.String(v3.RequestBodyLabel), edges)
case reflect.TypeOf(&wcModel.RequestBodyChanges{}):
DigIntoObject[wcModel.RequestBodyChanges](parent, field, nodes, upper.String(v3.RequestBodyLabel), edges)

case reflect.TypeOf([]*wcModel.TagChanges{}):
BuildSliceGraphNode[wcModel.TagChanges](parent, field, nodes, upper.String(v3.TagsLabel), edges)
case reflect.TypeOf([]*wcModel.TagChanges{}):
BuildSliceGraphNode[wcModel.TagChanges](parent, field, nodes, upper.String(v3.TagsLabel), edges)

case reflect.TypeOf([]*wcModel.SchemaChanges{}):
BuildSliceGraphNode[wcModel.SchemaChanges](parent, field, nodes,
strings.ToUpper(strings.ReplaceAll(fName, "Changes", "")), edges)
case reflect.TypeOf([]*wcModel.SchemaChanges{}):
BuildSliceGraphNode[wcModel.SchemaChanges](parent, field, nodes,
strings.ToUpper(strings.ReplaceAll(fName, "Changes", "")), edges)

case reflect.TypeOf([]*wcModel.ServerChanges{}):
BuildSliceGraphNode[wcModel.ServerChanges](parent, field, nodes, upper.String(v3.ServersLabel), edges)
case reflect.TypeOf([]*wcModel.ServerChanges{}):
BuildSliceGraphNode[wcModel.ServerChanges](parent, field, nodes, upper.String(v3.ServersLabel), edges)

case reflect.TypeOf([]*wcModel.SecurityRequirementChanges{}):
BuildSliceGraphNode[wcModel.SecurityRequirementChanges](parent, field, nodes,
"Security Requirements", edges)
case reflect.TypeOf([]*wcModel.SecurityRequirementChanges{}):
BuildSliceGraphNode[wcModel.SecurityRequirementChanges](parent, field, nodes,
"Security Requirements", edges)

case reflect.TypeOf([]*wcModel.ParameterChanges{}):
BuildSliceGraphNode[wcModel.ParameterChanges](parent, field, nodes,
upper.String(v3.ParametersLabel), edges)
case reflect.TypeOf([]*wcModel.ParameterChanges{}):
BuildSliceGraphNode[wcModel.ParameterChanges](parent, field, nodes,
upper.String(v3.ParametersLabel), edges)

case reflect.TypeOf(&wcModel.SchemaChanges{}):
DigIntoObject[wcModel.SchemaChanges](parent, field, nodes, upper.String(v3.SchemaLabel), edges)
case reflect.TypeOf(&wcModel.SchemaChanges{}):
DigIntoObject[wcModel.SchemaChanges](parent, field, nodes, upper.String(v3.SchemaLabel), edges)

case reflect.TypeOf(&wcModel.ExamplesChanges{}):
DigIntoObject[wcModel.ExamplesChanges](parent, field, nodes, upper.String(v3.ExamplesLabel), edges)
case reflect.TypeOf(&wcModel.ExamplesChanges{}):
DigIntoObject[wcModel.ExamplesChanges](parent, field, nodes, upper.String(v3.ExamplesLabel), edges)

case reflect.TypeOf(&wcModel.ExtensionChanges{}):
DigIntoObject[wcModel.ExtensionChanges](parent, field, nodes, "Extensions", edges)
case reflect.TypeOf(&wcModel.ExtensionChanges{}):
DigIntoObject[wcModel.ExtensionChanges](parent, field, nodes, "Extensions", edges)

case reflect.TypeOf(&wcModel.ExternalDocChanges{}):
DigIntoObject[wcModel.ExternalDocChanges](parent, field, nodes, "External Docs", edges)
case reflect.TypeOf(&wcModel.ExternalDocChanges{}):
DigIntoObject[wcModel.ExternalDocChanges](parent, field, nodes, "External Docs", edges)

case reflect.TypeOf(&wcModel.XMLChanges{}):
DigIntoObject[wcModel.XMLChanges](parent, field, nodes, upper.String(v3.XMLLabel), edges)
case reflect.TypeOf(&wcModel.XMLChanges{}):
DigIntoObject[wcModel.XMLChanges](parent, field, nodes, upper.String(v3.XMLLabel), edges)

case reflect.TypeOf(&wcModel.ScopesChanges{}):
DigIntoObject[wcModel.ScopesChanges](parent, field, nodes, upper.String(v3.Scopes), edges)
case reflect.TypeOf(&wcModel.ScopesChanges{}):
DigIntoObject[wcModel.ScopesChanges](parent, field, nodes, upper.String(v3.Scopes), edges)

case reflect.TypeOf(&wcModel.OAuthFlowChanges{}):
DigIntoObject[wcModel.OAuthFlowChanges](parent, field, nodes, "oAuth Flow", edges)
case reflect.TypeOf(&wcModel.OAuthFlowChanges{}):
DigIntoObject[wcModel.OAuthFlowChanges](parent, field, nodes, "oAuth Flow", edges)

case reflect.TypeOf(&wcModel.OAuthFlowsChanges{}):
DigIntoObject[wcModel.OAuthFlowsChanges](parent, field, nodes, "oAuth Flows", edges)
case reflect.TypeOf(&wcModel.OAuthFlowsChanges{}):
DigIntoObject[wcModel.OAuthFlowsChanges](parent, field, nodes, "oAuth Flows", edges)

case reflect.TypeOf(&wcModel.DiscriminatorChanges{}):
DigIntoObject[wcModel.DiscriminatorChanges](parent, field, nodes, "Discriminator", edges)
case reflect.TypeOf(&wcModel.DiscriminatorChanges{}):
DigIntoObject[wcModel.DiscriminatorChanges](parent, field, nodes, "Discriminator", edges)

case reflect.TypeOf(&wcModel.ResponsesChanges{}):
DigIntoObject[wcModel.ResponsesChanges](parent, field, nodes, upper.String(v3.ResponsesLabel), edges)
case reflect.TypeOf(&wcModel.ResponsesChanges{}):
DigIntoObject[wcModel.ResponsesChanges](parent, field, nodes, upper.String(v3.ResponsesLabel), edges)

case reflect.TypeOf(map[string]*wcModel.PathItemChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.PathItemChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.ResponseChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.ResponseChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.SchemaChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.SchemaChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.CallbackChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.CallbackChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.ExampleChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.ExampleChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.EncodingChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.EncodingChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.HeaderChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.HeaderChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.ServerVariableChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.ServerVariableChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.MediaTypeChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.MediaTypeChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.SecuritySchemeChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}
case reflect.TypeOf(map[string]*wcModel.SecuritySchemeChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.LinkChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

case reflect.TypeOf(map[string]*wcModel.LinkChanges{}):
if !field.IsZero() && len(field.MapKeys()) > 0 {
BuildGraphMapNode(parent, field, nodes, edges)
}

}

}
}
}
Expand Down
Loading

0 comments on commit eaf0303

Please sign in to comment.