Private/ConvertTo-CwSeverity.ps1

function ConvertTo-CwSeverity {
    <#
    .SYNOPSIS
        Maps a remaining-lifetime value (days or hours) onto a Nagios-style severity.
    .DESCRIPTION
        Core analyzer rule of cert-watchtower. Values at or below the critical
        threshold (or already negative, i.e. expired/stale) map to CRITICAL,
        values at or below the warning threshold map to WARNING, everything else
        is OK. With -AsExitCode the severity string is converted to the
        standardized process exit code (OK=0, WARNING=1, CRITICAL=2, UNKNOWN=3).
    #>

    [CmdletBinding(DefaultParameterSetName = 'Days')]
    [OutputType([string], [int])]
    param(
        [Parameter(Mandatory, ParameterSetName = 'Days')]
        [double]$DaysRemaining,

        [Parameter(ParameterSetName = 'Days')]
        [double]$WarnDays = 30,

        [Parameter(ParameterSetName = 'Days')]
        [double]$CritDays = 7,

        [Parameter(Mandatory, ParameterSetName = 'Hours')]
        [double]$HoursRemaining,

        [Parameter(ParameterSetName = 'Hours')]
        [double]$WarnHours = 24,

        [Parameter(ParameterSetName = 'Hours')]
        [double]$CritHours = 0,

        [Parameter(Mandatory, ParameterSetName = 'Severity')]
        [ValidateSet('OK', 'WARNING', 'CRITICAL', 'UNKNOWN')]
        [string]$Severity,

        [switch]$AsExitCode
    )

    $resolved = switch ($PSCmdlet.ParameterSetName) {
        'Days' {
            if ($DaysRemaining -le $CritDays) { 'CRITICAL' }
            elseif ($DaysRemaining -le $WarnDays) { 'WARNING' }
            else { 'OK' }
        }
        'Hours' {
            if ($HoursRemaining -le $CritHours) { 'CRITICAL' }
            elseif ($HoursRemaining -le $WarnHours) { 'WARNING' }
            else { 'OK' }
        }
        'Severity' { $Severity }
    }

    if ($AsExitCode) {
        switch ($resolved) {
            'OK'       { 0 }
            'WARNING'  { 1 }
            'CRITICAL' { 2 }
            default    { 3 }
        }
    }
    else {
        $resolved
    }
}