functions/ConvertTo-PuppetResourceApi.ps1

Function ConvertTo-PuppetResourceApi {
  <#
    .SYNOPSIS
      Collate the information about a DSC resource for building a Puppet resource_api type and provider
 
    .DESCRIPTION
      This function takes a DSC resource and returns the representation of that resource for the Puppet
      Resource API types and providers as a PowerShell object for further use.
 
    .PARAMETER DscResource
      The DscResourceInfo object to convert; can be passed via the pipeline, normally retrieved
      via calling Get-DscResource.
 
    .PARAMETER Name
      If not passing a full object, specify the name of the DSC Resource to retrieve and convert.
 
    .PARAMETER Module
      If not passing a full object, specify the module name of the the DSC Resource to retrieve and convert.
      Can be either a string or a hash containing the keys ModuleName and ModuleVersion.
 
    .EXAMPLE
      Get-DscResource -Name PSRepository | ConvertTo-PuppetResourceApi -OutVariable Foo
 
      Retrieve the representation of a Puppet Resource API type and provider from a DSC Resource object.
 
    .EXAMPLE
      ConvertTo-PuppetResourceApi -Name PSRepository
 
      Retrieve the representation of a Puppet Resource API type by searching for a DSC resource object via
      Get-DscResource. Will ONLY find the resource if it is in the PSModulePath.
 
    .NOTES
      This function currently takes EITHER:
 
      1. A DscResource Object, as passed by Get-DSCResource
      2. A combo of name/module to retrieve DSC Resources from
  #>

  [CmdletBinding(
    DefaultParameterSetName='ByObject'
  )]
  Param(
    [Parameter(
      ValueFromPipeline,
      ParameterSetName = 'ByObject'
    )]
    [Microsoft.PowerShell.DesiredStateConfiguration.DscResourceInfo[]]$DscResource,

    [Parameter(
      ValueFromPipelineByPropertyName,
      ParameterSetName = 'ByProperty'
    )]
    [string[]]$Name,

    [Parameter(
      ValueFromPipelineByPropertyName,
      ParameterSetName = 'ByProperty'
    )]
    [object]$Module
  )

  Begin{}

  Process {
    # Retrieve the DSC Resource information from the system unless passed directly
    If ($null -eq $DscResource) {
      if ($null -eq $Module) {
        $DscResourceToProcess = Get-DscResourceTypeInformation -Name $Name
      } else {
        $DscResourceToProcess = Get-DscResourceTypeInformation -Name $Name -Module $Module
      }
    } Else {
      $DscResourceToProcess = $DscResource
      If ($null -eq $DscResourceToProcess.ParameterInfo) { $DscResourceToProcess = Get-DscResourceTypeInformation -DscResource $DscResourceToProcess}
    }
    ForEach ($Resource in $DscResourceToProcess) {
      $PuppetizedName = "dsc_$($Resource.Name.ToLowerInvariant())"
      [PSCustomObject]@{
        Name         = $PuppetizedName
        RubyFileName = "$PuppetizedName.rb"
        Version      = [string]$Resource.Version
        Type         = Get-TypeContent -DscResource $Resource
        Provider     = Get-ProviderContent -DscResource $Resource
      }
    }
  }

  End {}
}