functions/Get-MdcaSubnet.ps1

function Get-MdcaSubnet {
    <#
    .SYNOPSIS
        Returns the available / configured subnets.
     
    .DESCRIPTION
        Returns the available / configured subnets.
 
        Note: Filter parameters are currently non-functional.
     
    .PARAMETER ID
        ID of a subnet to retrieve.
     
    .PARAMETER SortField
        Field by which to sort the results.
     
    .PARAMETER Descending
        Whether to sort in a descending order
     
    .PARAMETER Skip
        Skip the first X results
        Using this parameter disables the automatic paging feature.
     
    .PARAMETER Limit
        Maximum number of subnets to return.
        Using this parameter disables the automatic paging feature.
     
    .PARAMETER Filter
        A full filter to specify with the request
     
    .PARAMETER IncludeCategory
        Only return subnets that contain any of the specified categories.
     
    .PARAMETER ExcludeCategory
        Do not return subnets that contain any of the specified categories.
     
    .PARAMETER IncludeTag
        Only return subnets that contain any of the specified tags.
     
    .PARAMETER ExcludeTag
        Do not return subnets that contain any of the specified tags.
     
    .PARAMETER BuiltIn
        Specify whether built-in only or custom only subnets should be returned
     
    .EXAMPLE
        PS C:\> Get-MdcaSubnet
 
        Returns all subnets from MDCA
    #>

    [CmdletBinding(DefaultParameterSetName = 'default')]
    Param (
        [Parameter(Mandatory = $true, ParameterSetName = 'identity', ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('_id')]
        [string[]]
        $ID,

        [ValidateSet('category', 'tags', 'name')]
        [string]
        $SortField,

        [switch]
        $Descending,

        [int]
        $Skip,

        [int]
        $Limit,

        [Parameter(ParameterSetName = 'Filter')]
        [hashtable]
        $Filter,

        [Parameter(ParameterSetName = 'Condition')]
        [SubnetCategory[]]
        $IncludeCategory,

        [Parameter(ParameterSetName = 'Condition')]
        [SubnetCategory[]]
        $ExcludeCategory,

        [Parameter(ParameterSetName = 'Condition')]
        [string[]]
        $IncludeTag,

        [Parameter(ParameterSetName = 'Condition')]
        [string[]]
        $ExcludeTag,

        [Parameter(ParameterSetName = 'Condition')]
        [bool]
        $BuiltIn
    )
    
    begin {
        Assert-RestConnection -Service MDCA -Cmdlet $PSCmdlet
    }
    process {

        if ($ID) {
            foreach ($idString in $ID) {
                try { Invoke-RestRequest -Path "subnet/$idString" -ErrorAction Stop | ConvertFrom-RestSubnet }
                catch { $PSCmdlet.WriteError($_) }
            }
            return
        }

        $body = @{ }
        if ($SortField) {
            $body.sortField = $SortField
            $body.sortDirection = 'asc'
            if ($Descending) { $body.sortDirection = 'dsc' }
        }
        $noPaging = $false
        if ($PSBoundParameters.ContainsKey("Skip")) { $body.skip = $Skip; $noPaging = $true }
        if ($PSBoundParameters.ContainsKey("Limit")) { $body.limit = $Limit; $noPaging = $true }

        #region Filters
        # TODO: Figure out why filters are ignored
        switch ($PSCmdlet.ParameterSetName) {
            'Filter' { $body.filters = $Filter }
            'Condition' {
                $filterHash = @{}
                if ($IncludeCategory -or $ExcludeCategory) {
                    $filterHash.category = @{}
                    if ($IncludeCategory) {
                        $filterHash.category.eq = @($IncludeCategory | ForEach-Object { [int]$_ })
                    }
                    if ($ExcludeCategory) {
                        $filterHash.category.neq = @($ExcludeCategory | ForEach-Object { [int]$_ })
                    }
                }
                if ($IncludeTag -or $ExcludeTag) {
                    $filterHash.tags = @{ }
                    if ($IncludeTag) { $filterHash.tags.eq = $IncludeTag }
                    if ($ExcludeTag) { $filterHash.tags.neq = $ExcludeTag }
                }
                if ($PSBoundParameters.ContainsKey("BuiltIn")) {
                    $filterHash.builtIn = @{ eq = $BuiltIn }
                }
                $body.filters = $filterHash
            }
        }
        #endregion Filters

        do {
            $result = Invoke-RestRequest -Path subnet -Body $body
            $body.skip = @($result.Data).Count + $body.skip
            $result.data | ConvertFrom-RestSubnet
        }
        while ($result.hasNext -and -not $noPaging)
    }
}