completions/psc/hooks.ps1

function handleCompletions($completions) {
    if ($PSCompletions.pending.text -like '-*') {
        return $completions
    }
    $list = [System.Collections.Generic.List[object]]::new()
    $tokens = @($PSCompletions.tokens)
    # $tokens_text = @($tokens.text)
    $cmds = @($tokens | Where-Object type -EQ 'command')
    # $cmds_text = @($cmds.text)
    # $opts = @($tokens | Where-Object type -EQ 'option')
    # $opts_text = @($opts.text)
    $unknown = @($tokens | Where-Object type -EQ 'unknown')
    $unknown_text = @($unknown.text)
    function add {
        param([string]$completion, [array]$tip = $completion, [array]$symbol = @(), [switch]$noSkip)
        if ((-not $completion -or -not $noSkip) -and ($completion -in $unknown_text -or ($PSCompletions.pending -and $completion -notlike "$($PSCompletions.pending.text)*"))) { return }
        $list.Add($PSCompletions.return_completion($completion, $tip, $symbol))
    }
    function add_completions {
        $rest = $PSCompletions.data.list | Where-Object { $_ -notin $unknown_text }
        $symbol = if ($rest.Count -gt 1) { @('SpaceTab') }else { , @() }
        foreach ($completion in $rest) { add $completion (get_completion_info $completion) $symbol }
    }
    function get_completion_info {
        param ([string]$completion)
        @"
{{
`$c = Get-Content -Raw "$($PSCompletions.path.completions_json)" -Encoding utf8 -ErrorAction SilentlyContinue | ConvertFrom-Json | Select-Object -ExpandProperty meta | Select-Object -ExpandProperty "$completion";
`$m = `$c.'$($PSCompletions.config.language)';
if (!`$m) { `$m = `$c.'en-US' }
if (`$m) {
    if (`$m.url) { 'url: ' + `$m.url; "`n"}
    if (`$m.description) { '-----'; "`n"; `$m.description -join "`n"}
}
}}
"@

    }

    if ($PSCompletions.config.enable_cache) {
        $PSCompletions.info = $PSCompletions.completions.psc.info
    }

    switch ($cmds[0].text) {
        'add' {
            $rest = $PSCompletions.list | Where-Object { $_ -notin $unknown_text -and $_ -notin $PSCompletions.data.list }
            $symbol = if ($rest.Count -gt 1) { @('SpaceTab') }else { , @() }
            foreach ($completion in $rest) {
                add $completion (get_completion_info $completion) $symbol
            }
        }
        { $_ -in 'rm', 'update', 'info', 'which' } { add_completions }
        'alias' {
            switch ($cmds[1].text) {
                'add' {
                    if ($unknown.Count) {
                        break
                    }
                    foreach ($completion in $PSCompletions.data.list) {
                        add $completion $PSCompletions.replace_content($PSCompletions.info.alias.add.tip)
                    }
                }
                'rm' {
                    if ($unknown.Count) {
                        $cmd = $unknown[0].text
                        $alias = for ($i = 0; $i -lt $unknown.Count; $i++) { if ($i) { $unknown[$i].text } }
                        $rest = $PSCompletions.data.alias.$cmd | Where-Object { $_ -notin $alias }
                        if ($rest.Count -gt 2) {
                            $symbol = @('SpaceTab')
                        }
                        foreach ($completion in $rest) {
                            add -noSkip $completion $PSCompletions.replace_content($PSCompletions.info.alias.rm.tip_v) $symbol
                        }
                        break
                    }
                    add_completions
                }
            }
        }
        'completion' {
            if ($unknown.Count -ge 3) {
                break
            }
            if ($unknown.Count -eq 0) {
                add_completions
                break
            }
            $completion = $unknown[0].text
            if ($completion -notin $PSCompletions.list) {
                break
            }
            $language = $PSCompletions.get_language($completion)
            $json = $PSCompletions.get_raw_content("$($PSCompletions.path.completions)/$($completion)/language/$($language).json") | ConvertFrom-Json
            if ($unknown.Count -eq 1) {
                add 'language' $PSCompletions.replace_content($PSCompletions.info.completion.language.tip) @('SpaceTab')
                add 'enable_tip' $PSCompletions.replace_content($PSCompletions.info.completion.enable_tip.tip) @('SpaceTab')
                if ($PSCompletions.config.comp_config[$completion].Count) {
                    if ($PSCompletions.config.comp_config[$completion].keys.Contains('enable_hooks')) {
                        $tip = $PSCompletions.replace_content($PSCompletions.info.completion.enable_hooks.tip) -replace '<@\w+>', ''
                        add 'enable_hooks' $tip @('SpaceTab')
                        add 'enable_hooks_tip' $PSCompletions.replace_content($PSCompletions.info.completion.enable_hooks_tip.tip) @('SpaceTab')
                    }
                }
                foreach ($c in $json.config) {
                    $config_item = $c.name
                    $tip = $PSCompletions.replace_content($c.tip -join "`n") -replace '<\@\w+>', ''
                    $symbol = if ($c.values) { @('SpaceTab') }else { , @() }
                    add $c.name $tip $symbol
                }
                break
            }
            switch ($unknown[1].text) {
                'language' {
                    $config = $PSCompletions.get_raw_content("$($PSCompletions.path.completions)/$($completion)/config.json") | ConvertFrom-Json
                    foreach ($language in $config.language) {
                        add $language $PSCompletions.replace_content($PSCompletions.info.completion.language.tip_v)
                    }
                }
                { $_ -like 'enable_*' } {
                    foreach ($value in 0..1) {
                        add $value $PSCompletions.replace_content($PSCompletions.info.set_value)
                    }
                }
                default {
                    $c = $json.config.Where({ $_.name -eq $tokens[2].text })
                    foreach ($value in $c.values) {
                        add $value $PSCompletions.replace_content($PSCompletions.info.set_value)
                    }
                }
            }
        }
        'menu' {
            if ($cmds[1].text -eq 'custom' -and $cmds[2].text -eq 'color' -and $cmds[3].text -in $PSCompletions.menu.const.color_item) {
                foreach ($color in $PSCompletions.menu.const.color_value) {
                    add $color $PSCompletions.replace_content($PSCompletions.info.menu.custom.color.tip)
                }
            }
        }
        'reset' {
            switch ($cmds[1].text) {
                'alias' {
                    add_completions
                }
                'completion' {
                    add_completions
                }
            }
        }
    }

    return $completions + $list
}