Scripts/Public/Expand-ISHParameter.ps1

#
# Hat tip to
# * https://github.com/thinkbeforecoding/PSCompletion
# * http://www.powershellmagazine.com/2012/11/29/using-custom-argument-completers-in-powershell-3-0/
# * http://www.powertheshell.com/dynamicargumentcompletion/
# * https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/register-argumentcompleter?view=powershell-5.1
#
# Relies on
# Get-IshAuxSessionState.ps1
# New-IshAuxCompletionResult.ps1
# Register-IshAuxParameterCompleter.ps1
#


<#
    Create a global options to pass to [System.Management.Automation.CommandCompletion]::CompleteInput
    containing registered argument completers
#>

if (-not $global:options) {
    $global:options = @{CustomArgumentCompleters = @{};NativeArgumentCompleters = @{}}
}

<#
    Change the orignal TabExpansion2 function used for PS 3.0 completion
    to merge passed $options with $global:options
    The change will happen only once event if executed several times because
    on second pass, the function text doesn't match anymore
#>

$function:tabexpansion2 = $function:tabexpansion2 -replace 'End\r\n{','End { if ($null -ne $options) { $options += $global:options} else {$options = $global:options}'

#
# Thanks to the above boost, finally the added value for this module
#

Write-Debug ("[" + $MyInvocation.MyCommand + "] Parameter binding for *-IshLovValue:LovId")
$starIshLovValueLovId = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    $ishSession = Get-IshAuxSessionState -Name "ISHRemoteSessionStateIshSession"
    if (($null -ne $fakeBoundParameter['IshSession']) -And ($fakeBoundParameter['IshSession'].GetType().Name -eq 'IshSession') -And ($fakeBoundParameter['IshSession'].IshTypeFieldDefinition.Count -gt 0))
    {
        # Explicit -IshSession takes precedence over SessionState one
        $ishSession = $fakeBoundParameter['IshSession']
    }
    if ( $null -ne $ishSession)
    {
        $ishSession.IshTypeFieldDefinition |
        Where-Object { $_.ReferenceLov -like "$wordToComplete*" } |
        Sort-Object -Unique ReferenceLov |
        ForEach-Object { New-IshAuxCompletionResult -CompletionText $_.ReferenceLov }
    }
}
Register-IshAuxParameterCompleter -CommandName 'Add-IshLovValue' -ParameterName 'LovId' -ScriptBlock $starIshLovValueLovId
Register-IshAuxParameterCompleter -CommandName 'Get-IshLovValue' -ParameterName 'LovId' -ScriptBlock $starIshLovValueLovId
Register-IshAuxParameterCompleter -CommandName 'Remove-IshLovValue' -ParameterName 'LovId' -ScriptBlock $starIshLovValueLovId
Register-IshAuxParameterCompleter -CommandName 'Set-IshLovValue' -ParameterName 'LovId' -ScriptBlock $starIshLovValueLovId


Write-Debug ("[" + $MyInvocation.MyCommand + "] Parameter binding for *-*Field:Name (field names)")
$fieldName = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    $ishSession = Get-IshAuxSessionState -Name "ISHRemoteSessionStateIshSession"
    if (($null -ne $fakeBoundParameter['IshSession']) -And ($fakeBoundParameter['IshSession'].GetType().Name -eq 'IshSession') -And ($fakeBoundParameter['IshSession'].IshTypeFieldDefinition.Count -gt 0))
    {
        # Explicit -IshSession takes precedence over SessionState one
        $ishSession = $fakeBoundParameter['IshSession']
    }
    if ($ishSession -ne $null)
    {
        # TODO [Could] Expand parameter could take -Level into account to filter even more
        $ishSession.IshTypeFieldDefinition |
        Where-Object { $_.Name -like "$wordToComplete*" } |
        Sort-Object -Unique Name |
        
        # Creation with ToolTips is often too slow, causing Ctrl-Space actions to fall back to file system suggestion
        # ForEach-Object { New-IshAuxCompletionResult -CompletionText $_.Name -ToolTip ($_.Name + " (" + $_.Type + ") - " + $_.Description ) }
        ForEach-Object { New-IshAuxCompletionResult -CompletionText $_.Name }
    }
}
Register-IshAuxParameterCompleter -CommandName 'Get-IshMetadataField' -ParameterName 'Name' -ScriptBlock $fieldName
Register-IshAuxParameterCompleter -CommandName 'Set-IshMetadataField' -ParameterName 'Name' -ScriptBlock $fieldName
Register-IshAuxParameterCompleter -CommandName 'Set-IshMetadataFilterField' -ParameterName 'Name' -ScriptBlock $fieldName
Register-IshAuxParameterCompleter -CommandName 'Set-IshRequestedMetadataField' -ParameterName 'Name' -ScriptBlock $fieldName
Register-IshAuxParameterCompleter -CommandName 'Set-IshRequiredCurrentMetadataField' -ParameterName 'Name' -ScriptBlock $fieldName


Write-Debug ("[" + $MyInvocation.MyCommand + "] Parameter binding for *-*FieldName (field names)")
$fieldName = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameter)
    $ishSession = Get-IshAuxSessionState -Name "ISHRemoteSessionStateIshSession"
    if (($null -ne $fakeBoundParameter['IshSession']) -And ($fakeBoundParameter['IshSession'].GetType().Name -eq 'IshSession') -And ($fakeBoundParameter['IshSession'].IshTypeFieldDefinition.Count -gt 0))
    {
        # Explicit -IshSession takes precedence over SessionState one
        $ishSession = $fakeBoundParameter['IshSession']
    }
    if ($ishSession -ne $null)
    {
        # TODO [Could] Expand parameter could take -Level into account to filter even more
        $ishSession.IshTypeFieldDefinition |
        Where-Object { ($_.ISHType -eq 'ISHConfiguration') -and ($_.Name -like "$wordToComplete*") } |
        Sort-Object -Unique Name |
        
        # Creation with ToolTips is often too slow, causing Ctrl-Space actions to fall back to file system suggestion
        # ForEach-Object { New-IshAuxCompletionResult -CompletionText $_.Name -ToolTip ($_.Name + " (" + $_.Type + ") - " + $_.Description ) }
        ForEach-Object { New-IshAuxCompletionResult -CompletionText $_.Name }
    }
}
Register-IshAuxParameterCompleter -CommandName 'Get-IshSetting' -ParameterName 'FieldName' -ScriptBlock $fieldName
Register-IshAuxParameterCompleter -CommandName 'Set-IshSetting' -ParameterName 'FieldName' -ScriptBlock $fieldName