Update-AutoRestCode.psm1

<#
.Synopsis
   Fix AutoRest code generation utility output files
.DESCRIPTION
   Fix AutoRest code generation utility output files
.EXAMPLE
   autorest.cmd --add-credentials --csharp --input-file=d:\swagger.json --namespace=Lomtec.Project.Api.Client --output-folder=D:\output\
   Update-AutoRestCode -Path D:\output\ -Assemblies Lomtec.ActiveOffice.dll
.EXAMPLE
   autorest.cmd --add-credentials --csharp --input-file=d:\swagger.json --namespace=Lomtec.Project.Api.Client --output-folder=D:\output\
   Update-AutoRestCode -Path D:\output\ -ClientClassName ApiClient -Assemblies Lomtec.ActiveOffice.dll, Lomtec.Project.dll
.LINK
   https://aka.ms/autorest
    
.NOTES
   Author: Imrich Szolik
#>

function Update-AutoRestCode
{
    [CmdletBinding()]
    [Alias()]
    Param
    (
        # Assemblies
        [Parameter(Mandatory=$true, ValueFromPipelineByPropertyName=$true, Position=0)]
        [string[]]
        $Assemblies,
        # AutoRest output folder
        [Parameter(Mandatory=$true)]
        [string]
        $Path,
        # Requested client class name
        [Parameter(Mandatory=$false)]
        [string]
        $ClientClassName
    )
    Begin
    {
        #validate assembies
        foreach($assembly in $Assemblies){
            if(-not (Test-Path -Path $assembly -PathType Leaf)){
                throw "$assembly is not exist"
            }
        }

        #validat path
        if(-not (Test-Path -Path $Path -PathType Container)){
            throw "$Path is not valid"
        }

        #remove modules (we not use it!)
        if(Test-Path -Path "$Path/Models" -PathType Container){
            Remove-item -Force -Path "$Path/Models" -Recurse
        }

        #not valid ServiceClient name
        if($ClientClassName -eq "ServiceClient"){
            $ClientClassName = $null
        }
    }
    Process
    {
        #containers
        $genericClasses = [System.Collections.ArrayList]@()
        $simpleClasses = [System.Collections.ArrayList]@()
        
        #loading assemblies
        foreach($assembly in $Assemblies){
            Write-Verbose "Parsing $Assembly..."

            #loading
            $item = [System.Reflection.Assembly]::LoadFrom($assembly);
            Write-Progress -Activity 'Parsing assembies...' -CurrentOperation "$($item.GetName().Name)" -PercentComplete (20*$Assemblies.IndexOf($assembly)/$Assemblies.Count)

            #classes from assembly
            $types = $item.GetTypes()
            $allClasses = $types | Where-Object { $_.IsPublic -and $_.IsClass} 
            foreach($class in $allClasses){
                $name = $class.FullName

                if($class.IsGenericType){
                    if($name -notcontains "Anonymous"){
                        $genericClass = $name.Substring(0,$name.Length-2)
                        $code = $genericClass.Replace(".","")
                        $regex = [regex] ($code + "\w+(\(|\s|>)")
                    
                        $object = New-Object PSObject -Property @{ Class = $genericClass ; Regex = $regex; Length = $code.Length } 
                        $index = $genericClasses.Add($object)
                    }
                }
                else{
                    $object = New-Object PSObject -Property @{ Class = $name ; Code = $name.Replace(".","") }
                    $index = $simpleClasses.Add($object)
                
                }
            }
        }
        Write-Verbose "Found $($simpleClasses.Count + $genericClasses.Count) items"

        #looking for files
        $source = Get-ChildItem -Recurse -Path $Path -Filter *.cs -File

        #find serviceclient class name
        $autoRestClientName = $null
        if($ClientClassName){
            $generatedClassName = Select-String -Path "$Path/*.cs" -Pattern "ServiceClient<\w+>" -List
            #
            if($generatedClassName.Matches.Length -gt 0){
                $found = $generatedClassName.Matches[0].Value
                $autoRestClientName = $found.Substring($found.IndexOf("<")+1,$found.IndexOf(">")-$found.IndexOf("<")-1)
            }
            #
            if($autoRestClientName -eq $ClientClassName) {
                $autoRestClientName = $null
            }
            else{
                Write-Verbose "Found $autoRestClientName AutoRest class name"
            }
        }

        #processing files
        foreach($cs in $source){
            Write-Verbose "Processing $($cs.FullName)..."
            Write-Progress -Activity 'Processing files...' -CurrentOperation "$($cs.Name)" -PercentComplete (80*$source.IndexOf($cs)/$source.Count + 20)

            #get content
            $content = Get-Content -Path $cs.FullName 
            
            #remove models
            $content = $content.Replace("using Models;","")

            #change client class name
            if($autoRestClientName){
                $content = $content.Replace($autoRestClientName,$ClientClassName)
            }

            #rewrite generic class
            foreach($code in $genericClasses){
                $regex = $code.Regex
                $matches = $regex.Matches($content)

                foreach($m in $matches){
                    $oldCode = $m.Value.Substring(0,$m.Value.Length-1)
                    $genericType = $oldCode.Substring($code.Length)
                    $newCode  = $code.Class + "<" + $genericType + ">"

                    $content =  $content.Replace($oldCode, $newCode);
                }
            }
            
            #rewrite simple class
            foreach($code in $simpleClasses){
                    $content = $content.Replace($code.Code,$code.Class)
            }
            
              #set content
            Set-Content -Path $cs.FullName -Value $content -Force

            #rename serviceclient file
            if($autoRestClientName){
                if( $cs.Name -eq "$autoRestClientName.cs" ){
                    $newClientFile = (Split-Path $cs.FullName) + "/$ClientClassName.cs" 
                    Move-Item $cs.FullName -Destination $newClientFile -Force 
                }
                elseif ($cs.Name -eq "I$autoRestClientName.cs"){
                    $newClientFile = (Split-Path $cs.FullName)  + "/I$ClientClassName.cs"
                    Move-Item $cs.FullName -Destination $newClientFile -Force 
                }
            }
        }
    }
    End
    {
    }
}

Export-ModuleMember -Function Update-AutoRestCode


# SIG # Begin signature block
# MIIH7gYJKoZIhvcNAQcCoIIH3zCCB9sCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUAoBkCld3tbnJhqkVHmb7Err2
# jrSgggUPMIIFCzCCAvOgAwIBAgICAKUwDQYJKoZIhvcNAQELBQAwgaAxCzAJBgNV
# BAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2YTET
# MBEGA1UEChMKTG9tdGVjLmNvbTErMCkGA1UEAxMiTG9tdGVjLmNvbSBDZXJ0aWZp
# Y2F0aW9uIEF1dGhvcml0eTEnMCUGCSqGSIb3DQEJARYYSW1yaWNoLlN6b2xpa0Bs
# b210ZWMuY29tMB4XDTE5MDMyNjE1MDQ0M1oXDTMwMDEwMTAwMDAwMFowgZMxCzAJ
# BgNVBAYTAlNLMREwDwYDVQQIEwhTbG92YWtpYTETMBEGA1UEBxMKQnJhdGlzbGF2
# YTETMBEGA1UEChMKTG9tdGVjLmNvbTEeMBwGA1UEAxMVTG9tdGVjLmNvbSBQb3dl
# cnNoZWxsMScwJQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20w
# ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+J+Jwh25Ha39PSBzRUNj/
# 8+iONxiknLBSTkB1DJEQ9wC6FBS/1EQvbFtn2K6huVZBQCoZzNFcXoiAked3ALIT
# UoYxX+fD4Wkve947QqCXGroCFQVaBSLkPoJzWCadlXQWyDyjFuCY42TsQRJB6TFp
# n4rVylhinlOvEHJ96COjzvmEs7X1y3tTVPtRiDt3wOxNLx1T1H/6lmVzGFORJS0F
# ZvQF231+/Zk4Je+gOe/jguo/gHoZHdjj31JeMLJ6Md3zslAFAPIqI3lofez6V3f7
# PkZLsVnYLAuGElg1I4WUswZJpfbnq2KqPWvlwG9/Xb5KSvUz5d6uRzQUDJAn6fG5
# AgMBAAGjWjBYMAkGA1UdEwQCMAAwCwYDVR0PBAQDAgeAMCsGA1UdJQQkMCIGCCsG
# AQUFBwMDBgorBgEEAYI3AgEVBgorBgEEAYI3AgEWMBEGCWCGSAGG+EIBAQQEAwIE
# sDANBgkqhkiG9w0BAQsFAAOCAgEACSWqb/bJGI4eR07CZ6g3baoe2Djl7gPIPgyg
# Y/uYAxGROVfVYQBVafFCfUaCExhiEU1SHdJanCyYlUkx8d9OVVvWiA/L6O+5H608
# l7z1zSLE7R5z5JMB+O/gqImNyKT0C41AP0OkHasCDb78KJu/1nPjqCKpT3SR+Q2w
# ayMvOXa+jPy5t0cNgaJXE0cF0wd8QIcHrYe/AT+qW3AHd9hXcppEaKSyIobjbO4O
# 2Uf0P+fNNxvjokCDERsk72kPmkIyYBaZM6ezSMIc6LoHwjleO0nPPYxKVKsNeotl
# BX89ssDpVlMmLbntUtT4zNZY4CX0aPntMFJxaYBUM1xhdW02FWkOHt5yZXgA376n
# l6B9gGHgU28/QXKIJJH1EQAt4oqG9WzbOYxNQm6xAwsOpv9N5NKDppt8UJLF8gIQ
# WLlJEcLvY3eMtxcGf7Mgxi892+nGPKNWMiDTjgNwdq/drITbdK1oSbt7/qnCFZhU
# NGipYTTUaIlZUICezYDtFFfr1NpYIrHKVEsRLcSjfuOdK+PbLtOjQOs7Mp9whC1J
# lZD8o8eX8os8LfSsVbmDlEhG99mO0An3xydarRekrkKym4G/9uMu3Ag1ujw1Ubzz
# sklJSrvbD8pCAg4781wb42BCCzOwJrWAiARkIIpgbEL0xKFyV4sADotVzc9y8XI0
# B0P2TOMxggJJMIICRQIBATCBpzCBoDELMAkGA1UEBhMCU0sxETAPBgNVBAgTCFNs
# b3Zha2lhMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpMb210ZWMuY29t
# MSswKQYDVQQDEyJMb210ZWMuY29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MScw
# JQYJKoZIhvcNAQkBFhhJbXJpY2guU3pvbGlrQGxvbXRlYy5jb20CAgClMAkGBSsO
# AwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEM
# BgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEWMCMGCSqG
# SIb3DQEJBDEWBBQ3fZeCRUCFBO+EdjmpYeAhFvQHlzANBgkqhkiG9w0BAQEFAASC
# AQCxPjR7t5yMQ8KyM5tQqphUOuDPljhut7buXE7FlsLyOIfcVjK5/UjsokuShDZG
# Q4QDLVg1Hl7tBqVx6KcSga287aBilHJDgQJhr+oqxc6ubwGlfEbcEMa4so5wjQt6
# XneOoYBKFLZ+VF3yL2pJm6b2du73YUlKkjrmiIOBz9R3AiIIGdNl4WE+1D354uWf
# g9ZMIPc9vPC0E53IY/90gbc9RVJqsEbeywmamNWNR1MF/5g38KQyhdtnTRIFmXku
# WPCmQ8ujmxoen2h18PqdNL44UibyRIshhpVL8Nm2fAXbXTF5JNjZbCLQc3S/q2xY
# gd5sXkxHl/9TVSLb/CPwrI0A
# SIG # End signature block