functions/private/Resolve-KlippyPrinterTarget.ps1
|
function Resolve-KlippyPrinterTarget { <# .SYNOPSIS Resolves a printer target from various input methods. .DESCRIPTION Resolves a printer from the registry using Id, PrinterName, or pipeline input. Returns the default printer if no parameters are specified. Errors on ambiguous matches. .PARAMETER Id The unique identifier (GUID) of the printer. .PARAMETER PrinterName The friendly name of the printer. .PARAMETER InputObject A printer object from pipeline input. .PARAMETER Printers Optional pre-loaded printer collection to search. If not provided, reads from registry. .OUTPUTS PSCustomObject - The resolved printer object. #> [CmdletBinding(DefaultParameterSetName = 'Default')] [OutputType([PSCustomObject])] param( [Parameter(ParameterSetName = 'ById')] [ValidateNotNullOrEmpty()] [string]$Id, [Parameter(ParameterSetName = 'ByName')] [ValidateNotNullOrEmpty()] [string]$PrinterName, [Parameter(ParameterSetName = 'ByObject', ValueFromPipeline = $true)] [PSCustomObject]$InputObject, [Parameter()] [System.Collections.Generic.List[PSCustomObject]]$Printers ) process { # Load printers if not provided if (-not $Printers) { $Printers = Read-KlippyPrinterRegistry } if ($Printers.Count -eq 0) { throw "No printers configured. Use Add-KlippyPrinter to add a printer first." } # Resolve based on parameter set switch ($PSCmdlet.ParameterSetName) { 'ById' { $resolved = $Printers | Where-Object { $_.Id -eq $Id } if (-not $resolved) { throw "Printer with Id '$Id' not found." } return $resolved } 'ByName' { # Case-insensitive match $resolved = $Printers | Where-Object { $_.PrinterName -eq $PrinterName } if (-not $resolved) { # Try case-insensitive $resolved = $Printers | Where-Object { $_.PrinterName -ieq $PrinterName } } if (-not $resolved) { throw "Printer with name '$PrinterName' not found." } # Check for ambiguity (shouldn't happen due to uniqueness constraint, but be safe) if ($resolved -is [System.Array] -and $resolved.Count -gt 1) { throw "Ambiguous printer name '$PrinterName' matched multiple printers." } return $resolved } 'ByObject' { if ($null -eq $InputObject) { throw "Pipeline input object is null." } # Validate the input object has required properties if (-not $InputObject.Id) { throw "Pipeline input object must have an 'Id' property." } # Verify the printer exists in registry $resolved = $Printers | Where-Object { $_.Id -eq $InputObject.Id } if (-not $resolved) { throw "Printer with Id '$($InputObject.Id)' from pipeline not found in registry." } return $resolved } 'Default' { # Return default printer $defaultPrinter = $Printers | Where-Object { $_.IsDefault -eq $true } if (-not $defaultPrinter) { # If no default set, return the first printer if only one exists if ($Printers.Count -eq 1) { Write-Verbose "No default printer set, using only configured printer." return $Printers[0] } throw "No default printer configured and multiple printers exist. Specify -Id or -PrinterName, or set a default printer." } return $defaultPrinter } } } } |