Private/New-ServerConfigurationFromJson.ps1

function New-ServerConfigurationFromJson {
    [CmdletBinding()]
    [OutputType([psTPCCLASSES.ServerConfiguration[]])]
    param(
        [Parameter(Mandatory=$true)]
        [PSCustomObject] $JsonConfig
    )

        $servers = @()

        # Credential
        if ( $JsonConfig.CredentialName -and $JsonConfig.CredentialName -eq 'integrated') {
            $setCredential = $null
        } elseif ( $JsonConfig.CredentialName -eq 'get' ) {
            $setCredential = Get-Credential
        } else {
            $setCredential = Get-CredentialFromVault -VaultName $JsonConfig.SecretVaultName -CredentialName $JsonConfig.CredentialName
        }

        foreach ( $ServerConfig in $JsonConfig.servers ) {

            try {

                $performanceCounters    = @()
                $skipServer             = $false

                if ( $ServerConfig.CounterConfig ) {
                    foreach ( $CounterConfig in $ServerConfig.CounterConfig ) {

                        $param = @{}

                        if ( $null -eq $setCredential ) { $param['Credential'] = $setCredential }

                        $serverCounterMap = Get-CounterMap @param

                        $config = Get-CounterConfiguration -ConfigName $CounterConfig -isRemote -computername $ServerConfig.computername -credential $setCredential -counterMap $serverCounterMap

                        if ( $config.SkipServer ) {
                            $skipServer = $true
                            break
                        }

                        $performanceCounters += $config.Counters
                    }
                }

                if ( $skipServer ) {
                    Write-Warning "Skipping server '$($ServerConfig.computername)' - marked as unreachable during counter configuration."
                    continue
                }

                $serverConfiguration = [psTPCCLASSES.ServerConfiguration]::new(
                    $ServerConfig.computername,
                    $ServerConfig.comment,
                    $performanceCounters
                )

                $servers += $serverConfiguration

            } catch {

                Write-Warning "Failed to create ServerConfiguration for $($ServerConfig.computername): $_ . Skipping this server."
                continue

            }

        }

    return $servers


}