source_utils_nodeUtils.bs
' ContentNode utility functions
' Provides reusable utilities for manipulating ContentNode objects
' Reset nodes to their XML defaults
import "pkg:/source/utils/misc.bs"
namespace nodeUtils
' ============================================
' CONTENT NODE RESET UTILITIES
' ============================================
' Reset a ContentNode to its XML-defined defaults
'
' @param targetNode - The node to reset (must be a local reference)
' @param nodeType - The node type (for example "JellyfinServer", "JellyfinUser")
' @param preserveFields - Array of field names to preserve (for example ["settings"])
'
' Example:
' localServer = m.global.server
' nodeUtils.resetNodeToDefaults(localServer, "JellyfinServer", [])
'
' IMPORTANT: When resetting nodes on m.global, get a local reference first
' This minimizes rendezvous (only 1 rendezvous to get local ref, then 0 for reset)
sub resetNodeToDefaults(targetNode as object, nodeType as string, preserveFields = [] as object)
if not isValid(targetNode) or nodeType = ""
return
end if
' Create fresh node with XML defaults
freshNode = CreateObject("roSGNode", nodeType)
if not isValid(freshNode)
return
end if
' Get all default fields as associative array
defaultFields = freshNode.getFields()
' Build AA of fields to update (excluding preserved fields)
fieldsToUpdate = {}
for each fieldName in defaultFields
' Skip preserved fields
shouldPreserve = false
for each preservedField in preserveFields
if fieldName = preservedField
shouldPreserve = true
exit for
end if
end for
if not shouldPreserve
' Add field to update batch
fieldsToUpdate[fieldName] = defaultFields[fieldName]
end if
end for
' Update all fields at once using setFields() - single rendezvous
if fieldsToUpdate.Count() > 0
targetNode.setFields(fieldsToUpdate)
end if
end sub
end namespace