Private/Tui/Read-HydrationTuiMultiOption.ps1

function Read-HydrationTuiMultiOption {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Title,

        [Parameter(Mandatory)]
        [object[]]$Options,

        [Parameter(Mandatory)]
        [string]$Prompt,

        [Parameter(Mandatory)]
        [scriptblock]$ConvertOptions,

        [Parameter()]
        [switch]$AllowEmpty,

        [Parameter()]
        [object]$EmptyValue,

        [Parameter()]
        [string]$EmptySelectionWarning = 'Select at least one option.',

        [Parameter()]
        [switch]$ExclusiveFirst,

        [Parameter()]
        [switch]$AllowAllKeyword
    )

    $choices = @($Options | ForEach-Object { $_.Label })

    if (Test-HydrationTuiArrowKeySupport) {
        while ($true) {
            $selection = Show-HydrationTuiSelect -Title $Title -Choices $choices -Multiple -ExclusiveFirst:$ExclusiveFirst
            if ($null -eq $selection -or $selection.Cancelled) {
                return $null
            }

            if ($selection.Indices.Count -eq 0) {
                if ($AllowEmpty) {
                    return $EmptyValue
                }

                Write-Warning $EmptySelectionWarning
                continue
            }

            $selectedOptions = @($selection.Indices | ForEach-Object { $Options[$_] })
            return & $ConvertOptions $selectedOptions
        }
    }

    Show-HydrationTuiOptionPanel -Title $Title -Options $Options

    while ($true) {
        $inputResult = Read-HydrationTuiInput -Prompt $Prompt
        if ($inputResult.Cancelled) {
            return $null
        }

        try {
            $selectedOptions = @(Resolve-HydrationTuiOptionSelection `
                    -Options $Options `
                    -Selection $inputResult.Value `
                    -AllowAllKeyword:$AllowAllKeyword)

            if ($selectedOptions.Count -eq 0) {
                if ($AllowEmpty) {
                    return $EmptyValue
                }

                Write-Warning $EmptySelectionWarning
                continue
            }

            return & $ConvertOptions $selectedOptions
        } catch {
            Write-Warning $_.Exception.Message
        }
    }
}