completers4arguments.ps1

$serviceAll = {
    Param($wordToComplete, $commandAst)

    $dcOptions = New-Object System.Collections.ArrayList
    foreach ($ce in $commandAst.CommandElements) {
        if ($ce.Extent.Text -in (Invoke-Completer docker-compose -Completer).CompletionText) {
            break
        }
        $dcOptions.Add($ce.Extent.Text) > $null
    }
    Invoke-Expression -Command ("{0} config --services" -f ($dcOptions -join ' ')) | Sort-Object
}

$serviceRunning = {
    Param($wordToComplete, $commandAst)

    $dcOptions = New-Object System.Collections.ArrayList
    foreach ($ce in $commandAst.CommandElements) {
        if ($ce.Extent.Text -in (Invoke-Completer docker-compose -Completer).CompletionText) {
            break
        }
        $dcOptions.Add($ce.Extent.Text) > $null
    }

    $serviceNames = New-Object System.Collections.ArrayList
    $serviceIds = Invoke-Expression -Command ("{0} ps -q" -f ($dcOptions -join ' '))
    $runningIds = docker container ls --filter status=running --quiet --no-trunc | Where-Object { $_ -in $serviceIds }
    foreach ($id in $runningIds) {
        $c = docker container inspect $id | ConvertFrom-Json
        $serviceNames.Add($c.Config.Labels.'com.docker.compose.service') > $null
    }
    $serviceNames | Sort-Object
}

$serviceNotRunning = {
    Param($wordToComplete, $commandAst)

    $dcOptions = New-Object System.Collections.ArrayList
    foreach ($ce in $commandAst.CommandElements) {
        if ($ce.Extent.Text -in (Invoke-Completer docker-compose -Completer).CompletionText) {
            break
        }
        $dcOptions.Add($ce.Extent.Text) > $null
    }

    $serviceNames = New-Object System.Collections.ArrayList
    $runningIds = docker container ls --filter status=running --quiet --no-trunc
    $notRunningIds = Invoke-Expression -Command ("{0} ps -q" -f ($dcOptions -join ' ')) | Where-Object { $_ -notin $runningIds }
    foreach ($id in $notRunningIds) {
        $c = docker container inspect $id | ConvertFrom-Json
        $serviceNames.Add($c.Config.Labels.'com.docker.compose.service') > $null
    }
    $serviceNames | Sort-Object
}

$servicePaused = {
    Param($wordToComplete, $commandAst)

    $dcOptions = New-Object System.Collections.ArrayList
    foreach ($ce in $commandAst.CommandElements) {
        if ($ce.Extent.Text -in (Invoke-Completer docker-compose -Completer).CompletionText) {
            break
        }
        $dcOptions.Add($ce.Extent.Text) > $null
    }

    $serviceNames = New-Object System.Collections.ArrayList
    $serviceIds = Invoke-Expression -Command ("{0} ps -q" -f ($dcOptions -join ' '))
    $pausedIds = docker container ls --filter status=paused --quiet --no-trunc | Where-Object { $_ -in $serviceIds }
    foreach ($id in $pausedIds) {
        $c = docker container inspect $id | ConvertFrom-Json
        $serviceNames.Add($c.Config.Labels.'com.docker.compose.service') > $null
    }
    $serviceNames | Sort-Object
}

Register-Completer docker-compose_--context { docker context ls --quiet }
Register-Completer docker-compose_-c (Get-Completer docker-compose_--context)
Register-Completer docker-compose_--ansi { 'always', 'auto', 'never' }
Register-Completer docker-compose_--log-level { 'debug', 'info', 'warning', 'error', 'critical' }
Register-Completer docker-compose_build $serviceAll
Register-Completer docker-compose_build_--progress { 'auto', 'plain', 'tty' }
Register-Completer docker-compose_config_--hash $serviceAll
Register-Completer docker-compose_create $serviceAll
Register-Completer docker-compose_down_--rmi { 'all', 'local' }
Register-Completer docker-compose_events $serviceAll
Register-Completer docker-compose_exec $serviceRunning
Register-Completer docker-compose_help (Get-Completer docker-compose)
Register-Completer docker-compose_images $serviceAll
Register-Completer docker-compose_kill $serviceRunning
Register-Completer docker-compose_kill_-s {
    'SIGCONT'
    'SIGHUP'
    'SIGINT'
    'SIGKILL'
    'SIGSTOP'
    'SIGUSR1'
    'SIGUSR2'
}
Register-Completer docker-compose_logs $serviceAll
Register-Completer docker-compose_pause $serviceRunning
Register-Completer docker-compose_port $serviceAll
Register-Completer docker-compose_port_--protocol { 'tcp', 'udp' }
Register-Completer docker-compose_ps $serviceAll
Register-Completer docker-compose_ps_--filter {
    Param([string]$wordToComplete)

    if ($wordToComplete -notlike '*=*') {
        COMPGEN source string 'Service''s source'
        COMPGEN status string 'Service''s status'
        return
    }

    $key = ($wordToComplete -split '=')[0]
    $values = switch ($key) {
        source { 'build', 'image' }
        status { 'paused', 'restarting', 'running', 'stopped' }
    }

    foreach ($v in $values) {
        COMPGEN "$key=$v" string $v $v ([System.Management.Automation.CompletionResultType]::ParameterValue)
    }
}
Register-Completer docker-compose_pull $serviceAll
Register-Completer docker-compose_push $serviceAll
Register-Completer docker-compose_restart $serviceRunning
Register-Completer docker-compose_rm $serviceAll
Register-Completer docker-compose_run $serviceAll
Register-Completer docker-compose_scale $serviceAll
Register-Completer docker-compose_start $serviceNotRunning
Register-Completer docker-compose_stop $serviceRunning
Register-Completer docker-compose_top $serviceRunning
Register-Completer docker-compose_unpause $servicePaused
Register-Completer docker-compose_up $serviceAll
Register-Completer docker-compose_up_--exit-code-from $serviceAll
Register-Completer docker-compose_up_--scale $serviceAll