Private/Invoke-ColorScriptCacheOperation.ps1

function Invoke-ColorScriptCacheOperation {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)][string]$ScriptName,
        [Parameter(Mandatory)][string]$ScriptPath
    )

    $resultRecord = $null
    $warningMessage = $null
    $updated = 0
    $failed = 0

    $initializationError = $null
    try {
        Initialize-CacheDirectory
    }
    catch {
        $initializationError = $_.Exception
    }

    if (-not $script:CacheDir) {
        $failed = 1
        $status = 'Failed'
        $detail = if ($initializationError) { $initializationError.Message } else { $null }

        $messageTemplate = if ($script:Messages -and $script:Messages.ContainsKey('CacheOperationInitializationFailed')) {
            $script:Messages.CacheOperationInitializationFailed
        }
        else {
            'Unable to initialize the cache directory: {0}'
        }

        $detailValue = if (-not [string]::IsNullOrWhiteSpace($detail)) { $detail } else { 'n/a' }
        $message = $messageTemplate -f $detailValue
        $warningMessage = $message

        $resultRecord = [pscustomobject]@{
            Name        = $ScriptName
            ScriptPath  = $ScriptPath
            CacheFile   = $null
            Status      = $status
            Message     = $message
            CacheExists = $false
            ExitCode    = $null
            StdOut      = ''
            StdErr      = $detail
        }

        return [pscustomobject]@{
            Result  = $resultRecord
            Updated = $updated
            Failed  = $failed
            Warning = $warningMessage
        }
    }

    try {
        $cacheResult = Build-ScriptCache -ScriptPath $ScriptPath
    }
    catch {
        if (-not $script:CacheDir) {
            Initialize-CacheDirectory
        }
        $cacheResult = [pscustomobject]@{
            ScriptName = $ScriptName
            CacheFile  = Join-Path -Path $script:CacheDir -ChildPath ("{0}.cache" -f $ScriptName)
            Success    = $false
            ExitCode   = $null
            StdOut     = ''
            StdErr     = $_.Exception.Message
        }
    }

    if ($cacheResult.Success) {
        $updated = 1
        $status = 'Updated'
        $message = $script:Messages.StatusCached
        $cacheExists = $true
    }
    else {
        $failed = 1
        $status = 'Failed'

        $detailMessage = if ($cacheResult.StdErr) {
            $cacheResult.StdErr
        }
        elseif ($null -ne $cacheResult.ExitCode) {
            if ($script:Messages -and $script:Messages.ContainsKey('ScriptExitedWithCode')) {
                $script:Messages.ScriptExitedWithCode -f $cacheResult.ExitCode
            }
            else {
                "Script exited with code $($cacheResult.ExitCode)."
            }
        }
        else {
            if ($script:Messages -and $script:Messages.ContainsKey('CacheBuildGenericFailure')) {
                $script:Messages.CacheBuildGenericFailure
            }
            else {
                'Cache build failed.'
            }
        }

        $messageTemplate = if ($script:Messages -and $script:Messages.ContainsKey('CacheBuildFailedForScript')) {
            $script:Messages.CacheBuildFailedForScript
        }
        else {
            "Cache build failed for {0}: {1}"
        }

        $warningTemplate = if ($script:Messages -and $script:Messages.ContainsKey('CacheOperationWarning')) {
            $script:Messages.CacheOperationWarning
        }
        else {
            "Failed to cache '{0}': {1}"
        }

        $message = $detailMessage
        $warningMessage = $warningTemplate -f $ScriptName, $detailMessage
        $cacheExists = $false
        $cacheResult.CacheFile = if ($cacheResult.CacheFile) { $cacheResult.CacheFile } else { Join-Path -Path $script:CacheDir -ChildPath ("{0}.cache" -f $ScriptName) }

        $detailMessage = $messageTemplate -f $ScriptName, $detailMessage
        if (-not $warningMessage) {
            $warningMessage = $detailMessage
        }
        $message = $detailMessage
    }

    $resultRecord = [pscustomobject]@{
        Name        = if ($cacheResult.ScriptName) { $cacheResult.ScriptName } else { $ScriptName }
        ScriptPath  = $ScriptPath
        CacheFile   = $cacheResult.CacheFile
        Status      = $status
        Message     = $message
        CacheExists = $cacheExists
        ExitCode    = $cacheResult.ExitCode
        StdOut      = $cacheResult.StdOut
        StdErr      = $cacheResult.StdErr
    }

    return [pscustomobject]@{
        Result  = $resultRecord
        Updated = $updated
        Failed  = $failed
        Warning = $warningMessage
    }
}