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