Private/ArgumentCompleters.ps1

$acScriptEnvironment = {
    param($commandName, $parameterName, $stringMatch)
    # remove ' from search string if there was an space in the word
    OctoDeploy\Get-Environment | Where-Object name -Like $stringMatch* | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        # If the result contains a white pace, then enclose it with quotation marks
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}
<#
Register-ArgumentCompleter -CommandName Add-ProjectToTenant -ParameterName Environment -ScriptBlock $acScriptEnvironment
Register-ArgumentCompleter -CommandName Remove-ProjectFromTenant -ParameterName Environment -ScriptBlock $acScriptEnvironment
Register-ArgumentCompleter -CommandName Remove-ProjectEnvironmentFromTenant -ParameterName Environment -ScriptBlock $acScriptEnvironment
Register-ArgumentCompleter -CommandName Get-TenantWithoutMachine -ParameterName Environment -ScriptBlock $acScriptEnvironment
#>

$acScriptProject = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    OctoDeploy\Get-Project | Where-Object name -Like $stringMatch* | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}
<#
Register-ArgumentCompleter -CommandName Add-ProjectToTenant -ParameterName Project -ScriptBlock $acScriptProject
Register-ArgumentCompleter -CommandName Remove-ProjectFromTenant -ParameterName Project -ScriptBlock $acScriptProject
Register-ArgumentCompleter -CommandName Remove-ProjectEnvironmentFromTenant -ParameterName Project -ScriptBlock $acScriptProject
Register-ArgumentCompleter -CommandName Get-Release -ParameterName Project -ScriptBlock $acScriptProject
Register-ArgumentCompleter -CommandName Get-Channel -ParameterName Project -ScriptBlock $acScriptProject
#>


$acScriptTenant = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    OctoDeploy\Get-Tenant | Where-Object name -Like $stringMatch* | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptMachineRole = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-MachineRole | Where-Object {$_ -Like "$stringMatch*"} | Sort-Object | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptTagSet = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-TagSet | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}
$acScriptCanonicalTagName = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-TagSet -CanonicalTagName | Where-Object {$_ -Like "$stringMatch*"} | Sort-Object   | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptMachine = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-Machine | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptTaskType = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-Tasktype | Where-Object {$_.id -Like "$stringMatch*"} | Sort-Object -Property Id | Select-Object -ExpandProperty Id
}

$acScriptRunbook = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-Runbook | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}
$acScriptVariableSet = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-VariableSet | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptProjectGroup = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-ProjectGroup | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_  
        }
    }
}

$acScriptLifecycle = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-Lifecycle | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptProjectTrigger = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-ProjectTrigger | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

$acScriptSpace = {
    param($commandName, $parameterName, $stringMatch)
    $stringMatch = $stringMatch.trim("'") # remove ' from search string if there was an space in the word
    Get-Space | Where-Object {$_.name -Like "$stringMatch*"} | Sort-Object -Property name | Select-Object -ExpandProperty name | ForEach-Object {
        if ($_.toCharArray() -contains ' ') {
            "'$_'"
        } else {
            $_
        }
    }
}

######################################
# register completers
######################################
# Non standard registrations
Register-ArgumentCompleter -CommandName Get-Tenant -ParameterName Name -ScriptBlock $acScriptTenant
Register-ArgumentCompleter -CommandName Get-Project -ParameterName Name -ScriptBlock $acScriptProject
Register-ArgumentCompleter -CommandName Get-Environment -ParameterName Name -ScriptBlock $acScriptEnvironment
Register-ArgumentCompleter -CommandName Get-TagSet -ParameterName Name -ScriptBlock $acScriptTagSet
Register-ArgumentCompleter -CommandName Get-VariableSet -ParameterName Name -ScriptBlock $acScriptVariableSet
Register-ArgumentCompleter -CommandName Get-Runbook -ParameterName Name -ScriptBlock $acScriptRunbook
Register-ArgumentCompleter -CommandName Set-Space -ParameterName Name -ScriptBlock $acScriptSpace
Register-ArgumentCompleter -CommandName New-Tenant -ParameterName TemplateTenant -ScriptBlock $acScriptTenant

#Auto register argument completers to all eligible cmdlets
$module = $MyInvocation.MyCommand.Module
$commands = Get-Command -Module $module

foreach ($command in $commands) {
    if ($command.Parameters.keys -contains "Tenant") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Tenant -ScriptBlock $acScriptTenant
    }
    if ($command.Parameters.keys -contains "Project") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Project -ScriptBlock $acScriptProject
    }
    if ($command.Parameters.keys -contains "Environment") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Environment -ScriptBlock $acScriptEnvironment
    }
    if ($command.Parameters.keys -contains "MachineRole" -Or $command.Parameters.keys -contains "Role") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName MachineRole -ScriptBlock $acScriptMachineRole
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Role -ScriptBlock $acScriptMachineRole
    }
    if ($command.Parameters.keys -contains "TagSet") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName TagSet -ScriptBlock $acScriptTagSet
    }
    if ($command.Parameters.keys -contains "Machine") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Machine -ScriptBlock $acScriptMachine
    }
    if ($command.Parameters.keys -contains "TaskType") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName TaskType -ScriptBlock $acScriptTaskType
    }
    if ($command.Parameters.keys -contains "Runbook") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Runbook -ScriptBlock $acScriptRunbook
    }
    if ($command.Parameters.keys -contains "VariableSet") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName VariableSet -ScriptBlock $acScriptVariableSet
    }
    if ($command.Parameters.keys -contains "Tag") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Tag -ScriptBlock $acScriptCanonicalTagName
    }
    if ($command.Parameters.keys -contains "ProjectGroup") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName ProjectGroup -ScriptBlock $acScriptProjectGroup
    }
    if ($command.Parameters.keys -contains "Lifecycle") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName Lifecycle -ScriptBlock $acScriptLifecycle
    }
    if ($command.Parameters.keys -contains "ProjectTrigger") {
        Register-ArgumentCompleter -CommandName $command.name -ParameterName ProjectTrigger -ScriptBlock $acScriptProjectTrigger
    }

}