Private/Report/Get-NMMReportTemplate.ps1
|
function Get-NMMReportTemplate { <# .SYNOPSIS Resolves the appropriate report template for given data based on PSTypeName. .DESCRIPTION Uses a registry pattern to match PSTypeName to predefined templates. Falls back to auto-detection for unregistered types. #> [CmdletBinding()] param( [Parameter(Mandatory = $true)] [object]$InputObject, [Parameter()] [string]$ForcedTypeName ) # Load template registry $templatePath = Join-Path $PSScriptRoot '..\Data\ReportTemplates.json' $registry = Get-Content -Path $templatePath -Raw | ConvertFrom-Json -AsHashtable # Determine type name $typeName = if ($ForcedTypeName) { $ForcedTypeName } elseif ($InputObject.PSObject.TypeNames -and $InputObject.PSObject.TypeNames.Count -gt 0) { # Find first NMM.* type $InputObject.PSObject.TypeNames | Where-Object { $_ -like 'NMM.*' } | Select-Object -First 1 } else { $null } # Resolve template $template = if ($typeName -and $registry.templates.ContainsKey($typeName)) { $registry.templates[$typeName] } else { $registry.templates['Default'] } # If auto-detect, determine columns from object properties if ($template.autoDetectColumns) { $firstItem = if ($InputObject -is [array]) { $InputObject[0] } else { $InputObject } if ($firstItem) { $template.tableColumns = @($firstItem.PSObject.Properties.Name | Where-Object { $_ -notlike '_*' }) $template.columnHeaders = @{} foreach ($prop in $template.tableColumns) { # Convert camelCase to Title Case $header = ($prop -creplace '([A-Z])', ' $1').Trim() $header = (Get-Culture).TextInfo.ToTitleCase($header.ToLower()) $template.columnHeaders[$prop] = $header } } } return [PSCustomObject]@{ TypeName = $typeName Template = $template } } |