Public/Set-PaUrlCategory.ps1

function Set-PaUrlCategory {
    <#
    .SYNOPSIS
        Creates/Configures an Custom Url Category on a Palo Alto device.
        
    .DESCRIPTION
        Creates/Configures an Custom Url Category on a Palo Alto device.

    .EXAMPLE
        
    .PARAMETER Name
        
    #>

    [CmdletBinding(SupportsShouldProcess=$True)]

    Param (
        # paobject
        [Parameter(ParameterSetName="paobject",Mandatory=$True,Position=0,ValueFromPipeline=$True)]
        [PaUrlCategory]$PaUrlCategory,

        # manual
        [Parameter(ParameterSetName="manual",Mandatory=$True,Position=0)]
        [Parameter(ParameterSetName="replace",Mandatory=$True,Position=0)]
        [string]$Name,

        [Parameter(ParameterSetName="manual",Mandatory=$False,Position=1)]
        [Parameter(ParameterSetName="replace",Mandatory=$True,Position=1)]
        [string[]]$Members,

        [Parameter(ParameterSetName="manual",Mandatory=$False,Position=2)]
        [string]$Description,

        [Parameter(ParameterSetName="replace",Mandatory=$True)]
        [switch]$ReplaceMembers
    )

    BEGIN {
        $ConfigNode   = 'profiles/custom-url-category'
        $ResponseNode = 'custom-url-category'
        $VerbosePrefix = 'Set-PaUrlCategory:'
    }

    PROCESS {
        $InvokeParams = @{}

        Write-Verbose "$VerbosePrefix ParameterSetName: $($PsCmdlet.ParameterSetName)"
        switch ($PsCmdlet.ParameterSetName) {
            'paobject' {
                $ConfigObject = $PaUrlCategory
                $XPath = $Global:PaDeviceObject.createXPath($ConfigNode,$ConfigObject.Name)
                $InvokeParams.Set = $true
                continue
            }
            { ($_ -eq 'manual') -or 
              ($_ -eq 'replace') } {
                
                $ConfigObject = [PaUrlCategory]::new($Name)
                $XPath        = $Global:PaDeviceObject.createXPath($ConfigNode,$Name)

                if ($Description) {
                    $ConfigObject.Description = $Description
                }

                $ConfigObject.Members     = $Members
                
                if ($ReplaceMembers) {
                    $InvokeParams.Edit = $true
                    $XPath += '/list'
                } else {
                    $InvokeParams.Set = $true
                }
                continue
            }
        }

        $InvokeParams.XPath = $XPath
        $InvokeParams.Element = $ConfigObject.ToXml().$ResponseNode.entry.InnerXml

        $global:InvokeParams = $InvokeParams

        if ($PSCmdlet.ShouldProcess("Creating new Url Category: $($ConfigObject.Name)")) {
            $Set = Invoke-PaApiConfig @InvokeParams

            $Set
        }
    }
}