Public/Test-InfraPulseConfiguration.ps1

function Test-InfraPulseConfiguration {
    <#
    .SYNOPSIS
        Validates an InfraPulse configuration.

    .DESCRIPTION
        Loads a partial or complete configuration, merges it with the module defaults, and validates the effective configuration without running any checks.

    .PARAMETER Path
        Path to a PowerShell data file (.psd1).

    .PARAMETER Configuration
        Configuration hashtable supplied directly.

    .PARAMETER Quiet
        Returns only a Boolean validation result.

    .EXAMPLE
        Test-InfraPulseConfiguration -Path .\config\infra-pulse.example.psd1

    .EXAMPLE
        Test-InfraPulseConfiguration -Configuration @{ Checks = @{ Uptime = @{ WarningDays = 30 } } }
    #>

    [CmdletBinding(DefaultParameterSetName = 'Path')]
    param(
        [Parameter(Mandatory, ParameterSetName = 'Path', Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$Path,

        [Parameter(Mandatory, ParameterSetName = 'Configuration')]
        [ValidateNotNull()]
        [System.Collections.IDictionary]$Configuration,

        [switch]$Quiet
    )

    try {
        if ($PSCmdlet.ParameterSetName -eq 'Path') {
            $resolvedPath = (Resolve-Path -LiteralPath $Path -ErrorAction Stop).ProviderPath
            if ([System.IO.Path]::GetExtension($resolvedPath) -ne '.psd1') {
                throw 'Configuration files must use the .psd1 extension.'
            }
            $inputConfiguration = Import-PowerShellDataFile -Path $resolvedPath
            $source = $resolvedPath
        }
        else {
            $inputConfiguration = $Configuration
            $source = 'In-memory configuration'
        }

        $effective = Merge-InfraPulseHashtable -Base (Get-DefaultInfraPulseConfiguration) -Override $inputConfiguration
        $validation = Test-InfraPulseConfigurationData -Configuration $effective
        $result = [pscustomobject]@{
            Source                 = $source
            IsValid                = [bool]$validation.IsValid
            Errors                 = @($validation.Errors)
            Warnings               = @($validation.Warnings)
            EffectiveConfiguration = $effective
        }
    }
    catch {
        $result = [pscustomobject]@{
            Source                 = if ($PSCmdlet.ParameterSetName -eq 'Path') { $Path } else { 'In-memory configuration' }
            IsValid                = $false
            Errors                 = @($_.Exception.Message)
            Warnings               = @()
            EffectiveConfiguration = $null
        }
    }

    if ($Quiet) {
        return [bool]$result.IsValid
    }

    return $result
}