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 |