functions/New-DSCResourceSnippet.ps1


#requires -module PSDesiredStateConfiguration

Function New-DSCResourceSnippet {

    [cmdletbinding(SupportsShouldProcess = $True, DefaultParameterSetName = "Name")]
    Param(
        [Parameter(Position = 0, Mandatory = $True, HelpMessage = "Enter the name of a DSC resource",
            ParameterSetName = "Name")]
        [ValidateNotNullorEmpty()]
        [string[]]$Name,
        [Parameter(Position = 0, Mandatory = $True, HelpMessage = "Enter the name of a DSC resource",
            ValueFromPipeline = $True, ParameterSetName = "Resource")]
        [ValidateNotNullorEmpty()]
        [Microsoft.PowerShell.DesiredStateConfiguration.DscResourceInfo[]] $DSCResource,
        [ValidateNotNullorEmpty()]
        [string]$Author = $env:username,
        [Switch]$Passthru
    )

    Begin {
        Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"
    } #begin

    Process {

        if ($PSCmdlet.ParameterSetName -eq 'Name') {
            #get the resource from the name
            Try {
                Write-Verbose "Getting DSC Resource $Name"
                $DSCResource = Get-DscResource -Name $Name -ErrorAction Stop
            }
            Catch {
                Throw
            }
        }

        foreach ($resource in $DSCResource) {

            #create the entry based on resource properties
            [string[]]$entry = "`n$($resource.name) <ResourceID> {`n"

            Write-Verbose "Creating resource entry for $($resource.name)"
            $entry += "`t#from module $($resource.module.name)"
            $entry += foreach ($item in $resource.Properties) {
                if ($item.IsMandatory) {
                    $resourcename = "`t*$($item.name)"
                }
                else {
                    $resourcename = "`t$($item.name)"
                }

                if ($item.PropertyType -eq '[bool]') {
                    $possibleValues = "`$True | `$False"
                }
                elseif ($item.values) {
                    $possibleValues = "'$($item.Values -join "' | '")'"
                }
                else {
                    $possibleValues = $item.PropertyType
                }
                "$resourcename = $($possibleValues)"

            } #foreach

            $entry += "`n} #end $($resource.name) resource`n`n"

            $title = "DSC $($resource.name) Resource"
            $description = "$($resource.name) resource from module $($resource.module) $($resource.CompanyName)"

            Write-Verbose "Creating snippet $title"
            Write-Verbose $description
            Write-Verbose ($entry | Out-String)

            $paramHash = @{
                Title       = $Title
                Description = $description
                Text        = ($Entry | Out-String)
                Author      = $Author
                Force       = $True
                ErrorAction = "Stop"
            }

            Write-Verbose ($paramHash | Out-String)
            if ($PSCmdlet.ShouldProcess($Resource.name)) {

                Try {
                    Write-Debug "Creating snippet file"
                    New-IseSnippet @paramHash

                    if ($Passthru) {
                        #build the path
                        $snippath = join-path -path "$env:Userprofile\documents\WindowsPowerShell\Snippets" -ChildPath "$title.snippets.ps1xml"
                        Get-Item -path $snippath
                    }
                }
                Catch {
                    Throw
                }

            } #if shouldprocess
        } #foreach resource

    } #process

    End {
        #import the new snippets into the current session. They will
        #automatically be loaded next time.
        Write-Verbose "Importing new snippets"
        Import-IseSnippet -Path "$env:Userprofile\documents\WindowsPowerShell\Snippets"
        Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
    } #end


} #end function