Private/Tui/Read-HydrationTuiSingleOption.ps1

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

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

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

        [Parameter(Mandatory)]
        [scriptblock]$ConvertOption
    )

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

    if (Test-HydrationTuiArrowKeySupport) {
        $selection = Show-HydrationTuiSelect -Title $Title -Choices $choices
        if ($null -eq $selection -or $selection.Cancelled -or $selection.Indices.Count -eq 0) {
            return $null
        }

        return & $ConvertOption $Options[$selection.Indices[0]]
    }

    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)
            if ($selectedOptions.Count -ne 1) {
                throw 'Select exactly one option.'
            }

            return & $ConvertOption $selectedOptions[0]
        } catch {
            Write-Warning $_.Exception.Message
        }
    }
}