Core/Private/PathUtilities/Get-TreeModeHeader.ps1

# src/Private/PathUtilities/Get-TreeModeHeader.ps1

<#
.SYNOPSIS
    Generates the volume and header information for Tree mode.
 
.DESCRIPTION
    The Get-TreeModeHeader cmdlet generates the volume label and serial number header,
    matching the classic tree.com output. It also validates the drive and path. Used only in Tree.com compatibility mode.
#>

function Get-TreeModeHeader {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Path,
        $Colorize,
        [object]$StyleProfile = $null
    )

    if (-not $PSBoundParameters.ContainsKey('Debug') -and $PSCmdlet)
    {
        $DebugPreference = $PSCmdlet.GetVariableValue('DebugPreference')
    }
    if (-not $PSBoundParameters.ContainsKey('Verbose') -and $PSCmdlet)
    {
        $VerbosePreference = $PSCmdlet.GetVariableValue('VerbosePreference')
    }

    $StyleProfile = $StyleProfile ? (Get-ActiveShowTreeStyleProfile) : $StyleProfile
    $ui = $StyleProfile.UIStrings.TreeMode

    # Extract drive letter
    $drive = Split-Path $Path -Qualifier
    $driveName = $drive.TrimEnd(':')

    # 1. Invalid drive → tree.com behavior
    if ($driveName -and -not (Get-PSDrive -Name $driveName -ErrorAction SilentlyContinue)) {
        Write-Output $ui.InvalidDrive
        return $false
    }

    # 2. Valid drive → print header
    $nearestExistingParent = Get-NearestExistingParent -Path $Path
    $fileSystemLabel       = Get-VolumeName -Path $nearestExistingParent
    $serialNumber          = Get-VolumeSerialNumber -Path $nearestExistingParent

    Write-Output ($ui.VolumeListing -f $fileSystemLabel)
    Write-Output ($ui.VolumeSerial -f $serialNumber)

    # 3. Write the root path and stylize it
    $localIsWindows = $IsWindows ? $IsWindows : $true
    $rootItem = Get-Item -LiteralPath $Path -Force
    $native = [PSCustomObject]@{
        Platform       = $localIsWindows ? 'Windows' : 'Unix'
        FileAttributes = $rootItem.Attributes
    }

    $kind = $rootItem.PSIsContainer ? 'Directory' : 'File'

    $treeItem = New-TreeItem `
        -FullPath $rootItem.FullName `
        -IsContainer $rootItem.PSIsContainer `
        -Kind $kind `
        -Name $rootItem.Name `
        -Native $native `
        -Depth 0

    $style = Get-ItemStyle -Item $treeItem -Colorize:$Colorize -StyleProfile $StyleProfile
    $colorReset = $Colorize ? $StyleProfile.Reset : ""

    Write-Output "$($style.Ansi)$Path${colorReset}"
    
    # 4. Invalid path on valid drive → tree.com behavior
    if (-not (Test-Path $Path)) {
        # Check if it's a rooted path with a drive qualifier
        if ($drive) {
            $sub = $Path.Substring($drive.Length)
            Write-Output ($ui.InvalidPath -f $sub)
        } else {
            Write-Output ($ui.InvalidPath -f $Path)
        }
        Write-Output $ui.NoSubfolders
        return $false
    }

    return $true
}