functions/public/Get-KlippyExtruder.ps1

function Get-KlippyExtruder {
    <#
    .SYNOPSIS
        Gets extruder status from a Klipper printer.

    .DESCRIPTION
        Retrieves the status of all extruders configured on the printer,
        including temperature, target, pressure advance, and other settings.

    .PARAMETER Id
        The unique identifier of the printer.

    .PARAMETER PrinterName
        The friendly name of the printer.

    .PARAMETER InputObject
        A printer object from pipeline input.

    .PARAMETER Name
        Filter by specific extruder name (e.g., "extruder", "extruder1").

    .EXAMPLE
        Get-KlippyExtruder
        Gets all extruders from the default printer.

    .EXAMPLE
        Get-KlippyExtruder -PrinterName "voronv2"
        Gets all extruders from the specified printer.

    .EXAMPLE
        Get-KlippyExtruder -Name "extruder"
        Gets only the primary extruder.

    .OUTPUTS
        KlippyCLI.Extruder objects.
    #>

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(ParameterSetName = 'ById')]
        [ValidateNotNullOrEmpty()]
        [string]$Id,

        [Parameter(ParameterSetName = 'ByName', Position = 0)]
        [ValidateNotNullOrEmpty()]
        [string]$PrinterName,

        [Parameter(ParameterSetName = 'ByObject', ValueFromPipeline = $true)]
        [PSCustomObject]$InputObject,

        [Parameter()]
        [string]$Name
    )

    process {
        # Resolve printer
        $resolveParams = @{}
        switch ($PSCmdlet.ParameterSetName) {
            'ById' { $resolveParams['Id'] = $Id }
            'ByName' { $resolveParams['PrinterName'] = $PrinterName }
            'ByObject' { $resolveParams['InputObject'] = $InputObject }
        }

        $printer = Resolve-KlippyPrinterTarget @resolveParams

        try {
            # Get list of available objects
            $allObjects = Invoke-KlippyJsonRpc -Printer $printer -Method "printer/objects/list"

            # Filter for extruder objects (extruder, extruder1, extruder2, etc.)
            $extruderObjects = $allObjects.Objects | Where-Object {
                $_ -match '^extruder\d*$'
            }

            # Apply name filter
            if ($Name) {
                $extruderObjects = $extruderObjects | Where-Object { $_ -like $Name }
            }

            if (-not $extruderObjects) {
                Write-Verbose "No extruders found matching the specified criteria."
                return
            }

            # Build query string
            $queryParts = $extruderObjects | ForEach-Object { [System.Uri]::EscapeDataString($_) }
            $endpoint = "printer/objects/query?" + ($queryParts -join '&')

            $response = Invoke-KlippyJsonRpc -Printer $printer -Method $endpoint -NoNormalize

            # Process results
            foreach ($extruderName in $extruderObjects) {
                $data = $response.status.$extruderName
                if ($data) {
                    [PSCustomObject]@{
                        PSTypeName      = 'KlippyCLI.Extruder'
                        PrinterId       = $printer.Id
                        PrinterName     = $printer.PrinterName
                        Name            = $extruderName
                        Temperature     = [math]::Round($data.temperature, 1)
                        Target          = $data.target
                        Power           = if ($null -ne $data.power) { [math]::Round($data.power * 100, 1) } else { $null }
                        PressureAdvance = $data.pressure_advance
                        SmoothTime      = $data.smooth_time
                        CanExtrude      = $data.can_extrude
                    }
                }
            }
        }
        catch {
            Write-Error "Failed to get extruders from '$($printer.PrinterName)': $_"
        }
    }
}