Public/ConvertTo-ADOLogFormat.ps1

function ConvertTo-ADOLogFormat {
    <#
    .SYNOPSIS
    Convert code review violations to Azure DevOps logging commands
     
    .DESCRIPTION
    Transforms violation objects into Azure DevOps logging commands that appear
    as warnings/errors in the pipeline results and are linked to specific files/lines.
     
    .PARAMETER Violations
    Array of violation objects with file, line, severity, and message properties
     
    .PARAMETER SeverityFailBuild
    Severity level that should fail the build (error, warning, none). Default: error
     
    .EXAMPLE
    $violations | ConvertTo-ADOLogFormat
    Output violations as Azure DevOps logging commands
     
    .EXAMPLE
    ConvertTo-ADOLogFormat -Violations $violations -SeverityFailBuild "warning"
    Fail build on warnings or errors
     
    .OUTPUTS
    System.Int32 - Error count (0 if success, >0 if should fail)
     
    .NOTES
    Author: waldo
    Version: 1.0.0
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [AllowEmptyCollection()]
        [array]$Violations,
        
        [Parameter(Mandatory = $false)]
        [ValidateSet('error', 'warning', 'none')]
        [string]$SeverityFailBuild = 'error'
    )
    
    begin {
        Write-Verbose "Starting $($MyInvocation.MyCommand.Name)"
        $allViolations = @()
    }
    
    process {
        try {
            $allViolations += $Violations
        }
        catch {
            Write-Error "Error in $($MyInvocation.MyCommand.Name): $_"
            throw
        }
    }
    
    end {
        try {
            Write-Host "`n========================================="
            Write-Host "AI Code Review Results"
            Write-Host "=========================================`n"
            
            if ($allViolations.Count -eq 0) {
                Write-Host "✅ No violations found! Code looks good."
                Write-Host ""
                Write-Host "##vso[build.addbuildtag]AI-Review-Passed"
                return 0
            }
            
            # Count by severity
            $errorCount = ($allViolations | Where-Object { $_.severity -eq 'error' }).Count
            $warningCount = ($allViolations | Where-Object { $_.severity -eq 'warning' }).Count
            $infoCount = ($allViolations | Where-Object { $_.severity -eq 'info' }).Count
            
            Write-Host "Summary:"
            Write-Host " Errors: $errorCount"
            Write-Host " Warnings: $warningCount"
            Write-Host " Info: $infoCount"
            Write-Host ""
            
            # Group by file
            $violationsByFile = $allViolations | Group-Object -Property file
            
            foreach ($fileGroup in $violationsByFile) {
                Write-Host "File: $($fileGroup.Name)"
                Write-Host "----------------------------------------"
                
                foreach ($violation in ($fileGroup.Group | Sort-Object -Property line)) {
                    $emoji = switch ($violation.severity) {
                        'error' { '❌' }
                        'warning' { '⚠️' }
                        'info' { 'ℹ️' }
                    }
                    
                    Write-Host " $emoji Line $($violation.line): $($violation.message)"
                    
                    if ($violation.suggestion) {
                        Write-Host " 💡 Suggestion: $($violation.suggestion)"
                    }
                    
                    # Output Azure DevOps logging command
                    $issueType = if ($violation.severity -eq 'info') { 'warning' } else { $violation.severity }
                    $adoMessage = "##vso[task.logissue type=$issueType;sourcepath=$($violation.file);linenumber=$($violation.line)]$($violation.message)"
                    Write-Host $adoMessage
                }
                
                Write-Host ""
            }
            
            # Determine if build should fail
            $shouldFail = switch ($SeverityFailBuild) {
                'error' { $errorCount -gt 0 }
                'warning' { ($errorCount + $warningCount) -gt 0 }
                'none' { $false }
            }
            
            if ($shouldFail) {
                Write-Host "❌ Build will FAIL due to violations (severity threshold: $SeverityFailBuild)"
                Write-Host " Fix the issues above and push changes."
                Write-Host ""
                Write-Host "##vso[task.complete result=Failed;]Code review found blocking violations"
                Write-Host "##vso[build.addbuildtag]AI-Review-Failed"
            } else {
                Write-Host "✅ Build will CONTINUE despite violations (severity threshold: $SeverityFailBuild)"
                Write-Host ""
                Write-Host "##vso[build.addbuildtag]AI-Review-Passed-With-Warnings"
            }
            
            Write-Host "========================================="
            
            return $errorCount
        }
        catch {
            Write-Error "Error in $($MyInvocation.MyCommand.Name): $_"
            throw
        }
        finally {
            Write-Verbose "Completed $($MyInvocation.MyCommand.Name)"
        }
    }
}