functions/public/Set-PSIPAMAddress.ps1

function Set-PSIPAMAddress {
    [CmdletBinding()]
    param (
        [parameter(
            Mandatory=$true,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Id of subnet address belongs to",
            Position=0)]
        [ValidateScript({ $_ -match "^\d+$" })]
        [ValidateNotNullOrEmpty()]
        [string]
        $Id,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Defines if address is presented as gateway",
            Position=1)]
        [bool]
        $Gateway,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Address description",
            Position=2)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Description,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Address hostname",
            Position=3)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Hostname,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Mac address",
            Position=4)]
        [ValidateScript({ $_.Replace(":","") -match "^$('([A-F0-9]{2})' * 6)$" })]
        [ValidateNotNullOrEmpty()]
        [string]
        $MAC,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Address owner",
            Position=5)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Owner,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Id of subnet address belongs to",
            Position=6)]
        [ValidateScript({ $_ -match "^\d+$" })]
        [ValidateNotNullOrEmpty()]
        [string]
        $TagId,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Controls if PTR should not be created",
            Position=7)]
        [bool]
        $PTRIgnore,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Id of PowerDNS PTR record",
            Position=8)]
        [ValidateScript({ $_ -match "^\d+$" })]
        [ValidateNotNullOrEmpty()]
        [string]
        $PTRId,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Note",
            Position=9)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Note,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Exclude this address from status update scans (ping)",
            Position=10)]
        [bool]
        $ExcludePing,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Id of device address belongs to",
            Position=11)]
        [ValidateScript({ $_ -match "^\d+$" })]
        [ValidateNotNullOrEmpty()]
        [string]
        $DeviceId,
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true,
            HelpMessage="Port",
            Position=12)]
        [ValidateNotNullOrEmpty()]
        [string]
        $Port,

        [parameter(Mandatory=$false,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
        [ValidateScript({ $_ -is [Hashtable] -or $_ -is [PSCustomObject] })]
        $CustomFields
    )
    process {
        $_params = @{
            Controller = "addresses"
            Method     = "PATCH"
        }
        $_identifiers = @($Id)

        $_params.Add("Identifiers",$_identifiers)

        $_body = @{ }
        if ($Gateway)        { $_body.Add("is_gateway", [int]$Gateway) }
        if ($Description)    { $_body.Add("description", $Description) }
        if ($Hostname)       { $_body.Add("hostname", $Hostname) }
        if ($MAC)            { $_body.Add("mac", $MAC) }
        if ($Owner)          { $_body.Add("owner", $Owner) }
        if ($TagId)          { $_body.Add("tag", $TagId) }
        if ($PTRIgnore)      { $_body.Add("PTRignore", [int]$PTRIgnore) }
        if ($PTRId)          { $_body.add("PTR", $PTRId)}
        if ($Note)           { $_body.Add("note", $Note) }
        if ($ExcludePing)    { $_body.Add("excludePing", [int]$ExcludePing) }
        if ($DeviceId)       { $_body.Add("deviceId", $DeviceId) }
        if ($Port)           { $_body.Add("port", $Port) }

        if ($CustomFields) {
            if ($CustomFields -is [PSCustomObject]) {
                $_customFields = @{};
                $CustomFields | Get-Member -MemberType *Property | Where-Object {
                    $_customFields.($_.name) = $CustomFields.($_.name)
                }
            } else { $_customFields = $CustomFields }
    
            $_body = $_body + $_customFields
        }

        $_params.Add("Params",$_body)

        try {
            Invoke-PSIPAMRequest @_params
        }
        finally {
            Get-PSIPAMAddress -Id $Id
        }
    }
}
Export-ModuleMember -Function Set-PSIPAMAddress