Skip to content

Commit eb710cc

Browse files
committed
Address issue #219
Ensure better checks for nil / empty pointers when using reflection.
1 parent 91290a4 commit eb710cc

4 files changed

Lines changed: 45 additions & 37 deletions

File tree

builder/graph.go

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ func disableNode(node *model.NodeData[any]) {
264264
func DigIntoObject[T any](parent *model.NodeData[any], field reflect.Value, nodes *[]*model.NodeData[any],
265265
label string, edges *[]*model.EdgeData[any]) {
266266

267-
if !field.IsZero() {
267+
if !field.IsZero() && field.Elem().IsValid() && !field.Elem().IsZero() {
268268
lowerLabel := strings.ToLower(label)
269269
n := buildNode(lowerLabel, calcWidth(lowerLabel), DefaultHeight, nil)
270270
if parent != nil {
@@ -289,20 +289,22 @@ func BuildSliceGraphNode[T any](parent *model.NodeData[any], field reflect.Value
289289
if !field.IsZero() {
290290
for k := 0; k < field.Len(); k++ {
291291
f := field.Index(k)
292-
lowerLabel := strings.ToLower(label)
293-
n := buildNode(lowerLabel, calcWidth(lowerLabel), DefaultHeight, nil)
294-
if parent != nil {
295-
e := &model.EdgeData[any]{
296-
Id: fmt.Sprintf("%s-to-%s", parent.Id, n.Id),
297-
From: parent.Id,
298-
To: n.Id,
292+
if f.Elem().IsValid() && !f.Elem().IsZero() {
293+
lowerLabel := strings.ToLower(label)
294+
n := buildNode(lowerLabel, calcWidth(lowerLabel), DefaultHeight, nil)
295+
if parent != nil {
296+
e := &model.EdgeData[any]{
297+
Id: fmt.Sprintf("%s-to-%s", parent.Id, n.Id),
298+
From: parent.Id,
299+
To: n.Id,
300+
}
301+
*edges = append(*edges, e)
299302
}
300-
*edges = append(*edges, e)
303+
disableNode(n)
304+
*nodes = append(*nodes, n)
305+
obj := f.Elem().Interface().(T)
306+
exploreGraphObject(n, &obj, nodes, edges)
301307
}
302-
disableNode(n)
303-
*nodes = append(*nodes, n)
304-
obj := f.Elem().Interface().(T)
305-
exploreGraphObject(n, &obj, nodes, edges)
306308
}
307309
}
308310
}

builder/tree.go

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ func extractChangeCount(change reports.HasChanges) (int, int) {
287287
}
288288

289289
func DigIntoTreeNode[T any](parent *model.TreeNode, field reflect.Value, label string, tc, br int) {
290-
if !field.IsZero() {
290+
if !field.IsZero() && field.Elem().IsValid() && !field.Elem().IsZero() {
291291
e := &model.TreeNode{
292292
TitleString: label,
293293
Key: uuid.New().String(),
@@ -320,23 +320,25 @@ func DigIntoTreeNodeSlice[T any](parent *model.TreeNode, field reflect.Value, la
320320
if !field.IsZero() {
321321
for k := 0; k < field.Len(); k++ {
322322
f := field.Index(k)
323-
e := &model.TreeNode{
324-
TitleString: transformLabel(label),
325-
Key: uuid.New().String(),
326-
IsLeaf: false,
327-
Selectable: false,
328-
Disabled: false,
329-
}
330-
obj := f.Elem().Interface().(T)
331-
ch, br := countChanges(obj)
332-
if ch > -1 {
333-
e.TotalChanges = ch
334-
}
335-
if br > -1 {
336-
e.BreakingChanges = br
323+
if f.Elem().IsValid() && !f.Elem().IsZero() {
324+
e := &model.TreeNode{
325+
TitleString: transformLabel(label),
326+
Key: uuid.New().String(),
327+
IsLeaf: false,
328+
Selectable: false,
329+
Disabled: false,
330+
}
331+
obj := f.Elem().Interface().(T)
332+
ch, br := countChanges(obj)
333+
if ch > -1 {
334+
e.TotalChanges = ch
335+
}
336+
if br > -1 {
337+
e.BreakingChanges = br
338+
}
339+
parent.Children = append(parent.Children, e)
340+
exploreTreeObject(e, &obj)
337341
}
338-
parent.Children = append(parent.Children, e)
339-
exploreTreeObject(e, &obj)
340342
}
341343
}
342344
}

cmd/tree.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -225,15 +225,17 @@ func BuildSliceTreeNode[T any](list *[]pterm.LeveledListItem, field reflect.Valu
225225
if !field.IsZero() {
226226
for k := 0; k < field.Len(); k++ {
227227
f := field.Index(k)
228-
ob := f.Elem().Interface().(T)
229-
*list = append(*list, pterm.LeveledListItem{Level: level, Text: label})
230-
buildConsoleTreeNode(list, &ob, level+1, markdown)
228+
if f.Elem().IsValid() && !f.Elem().IsZero() {
229+
ob := f.Elem().Interface().(T)
230+
*list = append(*list, pterm.LeveledListItem{Level: level, Text: label})
231+
buildConsoleTreeNode(list, &ob, level+1, markdown)
232+
}
231233
}
232234
}
233235
}
234236

235237
func DigIntoObject[T any](list *[]pterm.LeveledListItem, field reflect.Value, level int, label string, markdown bool) {
236-
if !field.IsZero() {
238+
if !field.IsZero() && field.Elem().IsValid() && !field.Elem().IsZero() {
237239
*list = append(*list, pterm.LeveledListItem{Level: level, Text: label})
238240
level++
239241
obj := field.Elem().Interface().(T)

tui/build_tree.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -279,8 +279,10 @@ func BuildSliceTreeNode[T any](field reflect.Value, root *tview.TreeNode, obj an
279279
root.AddChild(node)
280280
for k := 0; k < field.Len(); k++ {
281281
f := field.Index(k)
282-
ob := f.Elem().Interface().(T)
283-
buildTreeNode(node, &ob)
282+
if f.Elem().IsValid() && !f.Elem().IsZero() {
283+
ob := f.Elem().Interface().(T)
284+
buildTreeNode(node, &ob)
285+
}
284286
}
285287
}
286288
}
@@ -310,7 +312,7 @@ func CreateNode(name string, object any) *tview.TreeNode {
310312
}
311313

312314
func DigIntoObject[T any](root, node *tview.TreeNode, field reflect.Value) {
313-
if !field.IsZero() {
315+
if !field.IsZero() && field.Elem().IsValid() && !field.Elem().IsZero() {
314316
obj := field.Elem().Interface().(T)
315317
buildTreeNode(node, &obj)
316318
root.AddChild(node)

0 commit comments

Comments
 (0)