Private/New-CISCheckResult.ps1

function New-CISCheckResult {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$ControlId,

        [Parameter(Mandatory)]
        [string]$Title,

        [Parameter(Mandatory)]
        [ValidateSet('PASS', 'FAIL', 'WARNING', 'INFO', 'ERROR')]
        [string]$Status,

        [Parameter()]
        [ValidateSet('Critical', 'High', 'Medium', 'Low', 'Informational')]
        [string]$Severity = 'Medium',

        [Parameter()]
        [string]$Section,

        [Parameter()]
        [string]$Subsection,

        [Parameter()]
        [ValidateSet('Automated', 'Manual')]
        [string]$AssessmentStatus = 'Automated',

        [Parameter()]
        [int]$ProfileLevel = 1,

        [Parameter()]
        [string]$Description,

        [Parameter()]
        [string]$Details,

        [Parameter()]
        [string]$Remediation,

        [Parameter()]
        [string[]]$AffectedResources = @(),

        [Parameter()]
        [int]$TotalResources = 0,

        [Parameter()]
        [int]$PassedResources = 0,

        [Parameter()]
        [int]$FailedResources = 0,

        [Parameter()]
        [string[]]$References = @(),

        [Parameter()]
        [string[]]$CISControls = @()
    )

    [PSCustomObject]@{
        PSTypeName       = 'CISBenchmarkResult'
        ControlId        = $ControlId
        Title            = $Title
        Status           = $Status
        Severity         = $Severity
        Section          = $Section
        Subsection       = $Subsection
        AssessmentStatus = $AssessmentStatus
        ProfileLevel     = $ProfileLevel
        Description      = $Description
        Details          = $Details
        Remediation      = $Remediation
        AffectedResources = $AffectedResources
        TotalResources   = $TotalResources
        PassedResources  = $PassedResources
        FailedResources  = $FailedResources
        References       = $References
        CISControls      = $CISControls
        Timestamp        = [DateTime]::UtcNow.ToString('o')
    }
}