410
// DeleteChild marks a child node and all its descendants as deleted, removing them from the cache. No transitions will
411
// be allowed after deleting a child.
412
>
func (n *Node) DeleteChild(key Key) error {
tree.go
413
>
if n.cache.deleted {
414
return fmt.Errorf("%w: cannot delete from deleted node: %v", ErrStateMachineInvalidState, n.Key)
415
}
416
417
>
child, err := n.Child([]Key{key})
tree.go
418
>
if err != nil {
419
return err
420
}
421
422
// Mark entire subtree as deleted
423
>
if err := child.Walk(func(n *Node) error {
tree.go
424
>
n.cache.deleted = true
425
>
return nil
426
>
}); err != nil {
427
return err
428
}
429
431
>
root.opLog = append(root.opLog, DeleteOperation{
432
>
path: child.Path(),
433
>
})
434
>
435
>
// Remove from persistence and cache
436
>
machinesMap := n.persistence.Children[key.Type]
437
>
if machinesMap != nil {
438
>
delete(machinesMap.MachinesById, key.ID)
439
>
if len(machinesMap.MachinesById) == 0 {
440
delete(n.persistence.Children, key.Type)
441
}
442
}
443
>
delete(n.cache.children, key)
tree.go
444
>
return nil
445
}
446