Private/Build-ScriptCache.ps1

function Build-ScriptCache {
    <#
    .SYNOPSIS
        Builds cache for a specific colorscript.
 
        The full path to the colorscript file.
    #>

    [CmdletBinding()]
    [OutputType([pscustomobject])]
    param(
        [Parameter(Mandatory)]
        [string]$ScriptPath
    )

    $scriptName = [System.IO.Path]::GetFileNameWithoutExtension($ScriptPath)
    $cacheFile = Join-Path $script:CacheDir "$scriptName.cache"

    $result = [pscustomobject]@{
        ScriptName = $scriptName
        CacheFile  = $cacheFile
        Success    = $false
        ExitCode   = $null
        StdOut     = ''
        StdErr     = ''
    }

    if (-not [System.IO.File]::Exists($ScriptPath)) {
        $result.StdErr = $script:Messages.ScriptPathNotFound
        return $result
    }

    $execution = Invoke-ColorScriptProcess -ScriptPath $ScriptPath -ForCache
    $result.ExitCode = $execution.ExitCode
    $result.StdOut = $execution.StdOut
    $result.StdErr = $execution.StdErr

    if ($execution.Success) {
        try {
            Invoke-FileWriteAllText -Path $cacheFile -Content $execution.StdOut -Encoding $script:Utf8NoBomEncoding

            try {
                $scriptLastWrite = Get-FileLastWriteTimeUtc -Path $ScriptPath
                Set-FileLastWriteTimeUtc -Path $cacheFile -Timestamp $scriptLastWrite
            }
            catch {
                $scriptLastWrite = Get-FileLastWriteTime -Path $ScriptPath
                Set-FileLastWriteTime -Path $cacheFile -Timestamp $scriptLastWrite
            }
            $result.Success = $true
        }
        catch {
            $result.StdErr = $_.Exception.Message
        }
    }
    elseif (-not $result.StdErr) {
        $result.StdErr = ($script:Messages.ScriptExitedWithCode -f $execution.ExitCode)
    }

    return $result
}