Sources/Console/New-Pagination.ps1

using namespace Belin.UI
using namespace System.Collections
using namespace System.Globalization
using namespace System.Web

<#
.SYNOPSIS
    Creates a new pagination.
.OUTPUTS
    The newly created pagination.
#>

function New-Pagination {
    [CmdletBinding(DefaultParameterSetName = "ItemsPerPage")]
    [OutputType([Belin.UI.Pagination])]
    param (
        # The number of items per page.
        [Parameter(ParameterSetName = "ItemsPerPage", Position = 1)]
        [ValidateRange(1, 1000)]
        [int] $ItemsPerPage = 25,

        # The current page index.
        [Parameter(ParameterSetName = "ItemsPerPage")]
        [ValidateRange("NonNegative")]
        [int] $CurrentPageIndex,

        # The total number of items.
        [Parameter(ParameterSetName = "ItemsPerPage")]
        [ValidateRange("NonNegative")]
        [int] $TotalItemCount,

        # The dictionary providing the query.
        [Parameter(Mandatory, ParameterSetName = "Query", Position = 1)]
        [IDictionary] $Query,

        # The string providing the query.
        [Parameter(Mandatory, ParameterSetName = "QueryString", Position = 1)]
        [AllowEmptyString()]
        [string] $QueryString,

        # The maximum number of items allowed per page.
        [Parameter(ParameterSetName = "Query")]
        [Parameter(ParameterSetName = "QueryString")]
        [ValidateRange(1, 1000)]
        [int] $MaxItemsPerPage = 1000
    )

    if ($PSCmdlet.ParameterSetName -eq "ItemsPerPage") {
        return [Pagination]@{
            CurrentPageIndex = $CurrentPageIndex
            ItemsPerPage = $ItemsPerPage
            TotalItemCount = $TotalItemCount
        }
    }

    $collection = $Query ? (New-HtmlQueryString $Query -AsCollection) : (New-HtmlQueryString -Value $QueryString -AsCollection)
    $parseInt = { param ([string] $key, [int] $defaultValue)
        $numericString = $collection[$key] ?? $defaultValue.ToString([cultureinfo]::InvariantCulture)
        $value = 0
        [int]::TryParse($numericString, [NumberStyles]::None, [cultureinfo]::InvariantCulture, [ref] $value) ? $value : $defaultValue
    }

    return [Pagination]@{
        CurrentPageIndex = (& $parseInt "Page" 1) - 1
        ItemsPerPage = [Math]::Min($MaxItemsPerPage, (& $parseInt "PerPage" 25))
    }
}