modules/analyzer/functions.psm1

function Build-Report {
    param(
        [Parameter(mandatory)]
        [psobject]$Analyzer_Data
    )
    Write-Output "PSScriptAnalyzer Report:`n"
    $return = [string[]]@(); $c1 = 1
    ForEach ($Item in ($Analyzer_Data)) {
        $data = Get-Content "$($Item.path)"
        $path = ($Item.path).split("/")
        $real_path = ($path[5..($path.count)]) -join '/'
        $file = "File: ($($c1)/$($Analyzer_Data.Count))"
        $file += "Name: $($Item.name)`n"
        $file += "Path: $real_path`n"
        $c2 = 0; $cc = 1; $wc = $Item.line.count
        foreach ($Rule in (1..$wc)) {
            $file += "`n ($cc/$wc) Rule: $($Item.rule[$c2])`n"
            $file += " Severity: $($Item.severity[$c2])`n"        
            $file += " Extent: $($Item.extent[$c2])`n"
            $file += " Line: $($Item.line[$c2])`n"
            $file += " Text: $(($data[$($Item.line[$c2] - 1)]).trim())`n"
            #$file += " Message: $($Item.message[$c2])"
            $c2++; $cc++
            if ($c2 -eq $wc) {
                break
            }
        }
        $return += $file; $c1++
    }
    return $return
}

function Start-PSAnalyzer {
    param(
        [System.IO.FileInfo]$scan_path = "$ENV:CI_PROJECT_DIR",
        [string[]]$additional_rules,
        [switch]$test
    )

    # collect rules
    $rules = (Import-LocalizedData -FileName "standard-rules.psd1").DefaultRules
    if ($additional_rules) {
        $rules += $additional_rules
    }

    # execute PSScriptAnalyzer
    $scriptanalyzer = Invoke-ScriptAnalyzer "$($scan_path.FullName)" -Recurse -IncludeRule $rules | Where-Object {$_.severity -ne 'ParseError'}
    $jcce = [PSCustomObject]@{
        scriptanalyzer = [PSCustomObject]@()
    }

    # Create File Properties
    $files = $scriptanalyzer.ScriptPath | Select-Object -Unique
    foreach ($file in $files) {
        $jcce.scriptanalyzer += [PSCustomObject][Ordered]@{
            path     = "$file"
            name     = @()
            extent   = @()
            line     = @()
            rule     = @()
            severity = @()
            message  = @()
        }
    }

    # Add $scriptanalyzer to policy file
    foreach ($file in ($scriptanalyzer | Sort-Object Line)) {
        $temp = $jcce.scriptanalyzer | Where-Object { $_.path -eq "$($file.ScriptPath)" }
        $temp.name += $file.ScriptName
        $temp.extent += $file.Extent
        $temp.line += $file.Line
        $temp.rule += $file.RuleName
        $temp.severity += $file.Severity
        $temp.message += $file.Message
    }

    # create report for pipeline log
    $report = Build-Report -Analyzer_Data $jcce.scriptanalyzer

    # test
    $warnings = ($jcce.scriptanalyzer.severity | Where-Object {$_ -ne 'Information'}).count

    # return results
    if ($warnings -gt 0) {
        Write-Output "$report"
        Write-Output " "
        # if test tell runner to continue
        if ($test) {
            exit 0
        }
        else {
            exit 1
        }
    }
    else {
        Write-Output "Found No Issues In Code`n"
        Write-Output " "
        exit 0
    }
}