Utilities/Invoke-ParseFilterSegment.ps1

#TODO: Make Signal Doctrine Compliant
function Invoke-ParseFilterSegment {
    param([string]$segment)

    $result = @{
        IsFilter = $false
        Raw = $segment
    }

    # Match the base key before any filters
    if ($segment -match '^([^\[]+)') {
        $result.ArrayKey = $matches[1]
    } else {
        return $result
    }

    # Match all [key op value] filters
    $filterPattern = "\[([^\[\]=!~]+?)(!?=|~=|~=i)\s*([""'])(.*?)\3\]"

    $matches = [regex]::Matches($segment, $filterPattern)

    if ($matches.Count -gt 0) {
        $result.IsFilter = $true
        $result.Filters = @()

        foreach ($m in $matches) {
            $op = switch ($m.Groups[2].Value) {
                '='     { '-eq' }
                '!='    { '-ne' }
                '~='    { '-like' }
                '~=i'   { '-ilike' }
                default { '-eq' }
            }

            $result.Filters += @{
                Key   = $m.Groups[1].Value.Trim()
                Op    = $op
                Value = $m.Groups[3].Value.Trim()
            }
        }
    }

    return $result
}