SwaggerModule.psm1
function Get-ObjectMember { [CmdletBinding()] Param( [Parameter(Mandatory = $True, ValueFromPipeline = $True)] [PSCustomObject]$obj ) process { $obj | Get-Member -MemberType NoteProperty | ForEach-Object { $key = $_.Name [PSCustomObject]@{Key = $key; Value = $obj."$key" } } } } function Get-ParameterInfo { param ( # Parameter help description [Parameter(Mandatory=$true)] [PSCustomObject] $parameterObject ) $parameterInfo = "" switch ($parameterObject.Count) { 0 { break; } 1 { $parameterInfo = $parameterobject | Format-List Name, Type, Required, Description | Out-String break; } Default { $parameterInfo = ($parameterObject | format-table name, required, type, description -autosize | out-string ); break; } } return $parameterInfo.Trim() } function Get-RestURI{ [CmdletBinding(DefaultParameterSetName='File')] [OutputType([String])] param ( [Parameter(Mandatory=$true, ParameterSetName='File', Position=0)] [string] $filePath, # Parameter help description [Parameter(Mandatory=$true, ParameterSetName='Object')] [PSCustomObject] $swagger ) if ($filePath){ $swagger = Get-Content $filePath -Raw | ConvertFrom-Json } if ($swagger.servers.url){ return $swagger.servers.url; } if ($swagger.schemes -and $swagger.host -and $swagger.basePath){ return ("{0}://{1}{2}" -f $swagger.schemes[0], $swagger.host, $swagger.basePath) } return "Unknown" } function Get-SwaggerPath{ [CmdletBinding(DefaultParameterSetName='File')] # [OutputType([String])] param ( [Parameter(Mandatory=$true, ParameterSetName='File', Position=0)] [string] $filePath, # Parameter help description [Parameter(Mandatory=$true, ParameterSetName='Object')] [PSCustomObject] $swagger ) if ($filePath){ $swagger = Get-Content $filePath -Raw | ConvertFrom-Json } if (-not $swagger.paths){ Write-Verbose "No paths found" return } $restURI = Get-RestURI -swagger $swagger $swagger.paths | Get-ObjectMember | ForEach-Object { # For every path $path = $_.Key # $methodJSON = $_.Value | Get-ObjectMember | ForEach-Object { [pscustomobject]@{ path = $path fullPath = $restURI+$path method = $_.Key parameters = $_.Value.parameters.name parameterCount = $_.Value.parameters.count parameterInfo = (Get-ParameterInfo ($_.value.parameters)) #parameterInfo = ($_.Value.parameters | format-table name, required, type, description -autosize | out-string ).trim() } } } } function Parse-Swaggerfile { [CmdletBinding()] Param( [Parameter(Mandatory = $True, ValueFromPipeline = $True)] $path ) process{ # TODO: File info (filnavn, størrelse, antal linjer/ord, datoer) if (-not (Test-Path $path -PathType Leaf)) { Write-Error "File not found ($path)"; return } try { $swagger = Get-Content -Path $path -Encoding UTF8 -Raw | ConvertFrom-Json -ErrorAction SilentlyContinue #$swagger = Get-Content -Path $path -Encoding UTF8 -Raw -erroraction Stop | ConvertFrom-Json } catch [System.ArgumentException] { Write-Error "Invalid JSON file: $_" return } catch { Write-Error "Unknown error: $($_.Exception.GetType().FullName)" Write-Error $_.Exception.Message return } $restURI = Get-RestURI -swagger $swagger # if ($swagger.openapi){ # $restURI = $swagger.servers.url # } else { # $restURI = ("{0}://{1}{2}" -f $swagger.schemes[0], $swagger.host, $swagger.basePath) # } $security = switch ($swagger) { {$_.components.securitySchemes.'x-api-key'} { "x-api-key"; break } {$_.securityDefinitions.'x-api-key'} { "x-api-key"; break } {$_.securityDefinitions.custom_scheme} {$_.securityDefinitions.custom_scheme.type; break} Default {"unknown"} } $paths = Get-SwaggerPath -swagger $swagger $serviceInfo = [ordered]@{ Title = $swagger.info.title Version = $swagger.info.version BaseURL = $restURI Security = $security Paths = ($paths | Select-Object path, @{N='parameters';E={$_.parameters -join ","}}) PathsExpanded = ($paths | Format-List | Out-String) } return New-Object -TypeName psobject -Property $serviceInfo # Output base info # $serviceInfo # | select Title, Version, BaseURL, Security } } Export-ModuleMember -Function Parse-Swaggerfile |