Public/Invoke-PSRunSelector.ps1

function Invoke-PSRunSelector
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [Object[]]$InputObject,

        [String]$NameProperty = 'Name',

        [String]$DescriptionProperty = 'Description',

        [String]$PreviewProperty = 'Preview',

        [ScriptBlock]$Expression,

        [Switch]$MultiSelection,

        [PowerShellRun.SelectorOption]$Option = $script:globalStore.defaultSelectorOption,

        [PowerShellRun.SelectorContext]$Context
    )

    begin
    {
        $entries = [System.Collections.Generic.List[PowerShellRun.SelectorEntry]]::new()
    }
    process
    {
        foreach ($obj in $InputObject)
        {
            $entry = [PowerShellRun.SelectorEntry]::new()
            $entry.UserData = $obj
            if ($Expression)
            {
                $obj = $obj | ForEach-Object $Expression
            }
            if (($null -eq $obj.$NameProperty))
            {
                if ($null -ne $obj)
                {
                    $entry.Name = $obj.ToString()
                }
            }
            else
            {
                $entry.Name = $obj.$NameProperty
            }
            $entry.Description = $obj.$DescriptionProperty
            $entry.Preview = $obj.$PreviewProperty
            $entries.Add($entry)
        }
    }
    end
    {
        $mode = if ($MultiSelection) {[PowerShellRun.SelectorMode]::MultiSelection} else {[PowerShellRun.SelectorMode]::SingleSelection}
        $result = [PowerShellRun.Selector]::Open($entries, $mode, $Option, $Context)

        if ($result.MarkedEntries)
        {
            $result.MarkedEntries.UserData
        }
        else
        {
            $result.FocusedEntry.UserData
        }
    }
}