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