Private/Format-LMFilter.ps1

<#
.SYNOPSIS
Formats the LogicMonitor filter for API requests.

.DESCRIPTION
The Format-LMFilter function is used to format the LogicMonitor filter for API requests. It takes an input filter object and an optional list of properties to include in the formatted filter. The function supports both legacy and new filter formats.

.PARAMETER Filter
The input filter object. It can be a hashtable or a string.

.PARAMETER PropList
An optional list of properties to include in the formatted filter. The default value is an array containing the following properties: "name", "id", "status", "severity", "startEpoch", "endEpoch", "cleared", "resourceTemplateName", "monitorObjectName", "customProperties", "systemProperties", "autoProperties", "displayName".

.OUTPUTS
The formatted filter string.

.EXAMPLE
$filter = @{
    name = "MyMonitor"
    status = "active"
}
$formattedFilter = Format-LMFilter -Filter $filter
Write-Host $formattedFilter
# Output: name:"MyMonitor",status:"active"

.EXAMPLE
$filter = "name -eq 'MyMonitor' -and status -eq 'active'"
$formattedFilter = Format-LMFilter -Filter $filter
Write-Host $formattedFilter
# Output: name:"MyMonitor",status:"active"
#>


Function Format-LMFilter {
    [CmdletBinding()]
    Param (
        [Object]$Filter,

        [String[]]$PropList = @("name", "id", "status", "severity", "startEpoch", "endEpoch", "cleared", "resourceTemplateName", "monitorObjectName", "customProperties", "systemProperties", "autoProperties", "displayName")
    )
    $FormatedFilter = ""
    #Keep legacy filter method for backwards compatability
    If ($Filter -is [hashtable]) {
        $FormatedFilter = Format-LMFilter-v1 -Filter $Filter -PropList $PropList
        Write-Debug "Constructed Filter-v1: $FormatedFilter"
        Return $FormatedFilter
    }
    Else {    
        #Split our filters in an array based on logical operator
        $FilterArray = [regex]::Split($Filter, '(\s+-and\s+|\s+-or\s+)')
    
        Foreach ($Filter in $FilterArray) {
            If ($Filter -match '\s+-and\s+') {
                $FormatedFilter += ","
            }
            Elseif ($Filter -match '\s+-or\s+') {
                $FormatedFilter += "||"
            }
            Else {
                $SingleFilterArray = [regex]::Split($Filter, '(\s+-eq\s+|\s+-ne\s+|\s+-gt\s+|\s+-lt\s+|\s+-ge\s+|\s+-le\s+|\s+-contains\s+|\s+-notcontains\s+)')
                If (($SingleFilterArray | Measure-Object).Count -gt 1) {
                    Foreach ($SingleFilter in $SingleFilterArray) {
                        If ($SingleFilter -match '(\s+-eq\s+|\s+-ne\s+|\s+-gt\s+|\s+-lt\s+|\s+-ge\s+|\s+-le\s+|\s+-contains\s+|\s+-notcontains\s+)') {
                            Switch -Regex ($SingleFilter) {
                                '\s+-eq\s+' { $FormatedFilter += ":" }
                                '\s+-ne\s+' { $FormatedFilter += "!:" }
                                '\s+-gt\s+' { $FormatedFilter += ">" }
                                '\s+-lt\s+' { $FormatedFilter += "<" }
                                '\s+-ge\s+' { $FormatedFilter += ">:" }
                                '\s+-le\s+' { $FormatedFilter += "<:" }
                                '\s+-contains\s+' { $FormatedFilter += "~" }
                                '\s+-notcontains\s+' { $FormatedFilter += "!~" }
                                default { Write-LMHost "[ERROR]: Invalid filter syntax: $Filter" -ForegroundColor Red }
                            }
                        }
                        Else {
                            $FormatedFilter += $SingleFilter.Replace("'", "`"") #replace single quotes with double quotes as reqired by LM API
                        }
                    }
                }
                Else {
                    Write-LMHost "[ERROR]: Invalid filter syntax: $SingleFilterArray" -ForegroundColor Red
                }
            }
        }
        Write-Debug "Constructed Filter-v2: $FormatedFilter"
        Return $FormatedFilter
    }
}