scripts/Build-Path.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function Build-Path {
  [CmdletBinding()]
  [OutputType([string])]
  param (
    [Parameter(Position = 0, Mandatory = $false, ValueFromPipeline = $true)]
    [string]$path,

    [Parameter(Position = 1, Mandatory = $false)]
    [hashtable]$config = (Coalesce (Peek-Config), @{}),

    [Parameter(Mandatory = $false)]
    [switch]$Unresolved
  )
  process {
    "Build-Path:In:`$path = $path" | f-log-dbg
    if (-not $path) {
      return $null
    }

    if (Test-Path $path) {
      $path = "$(Convert-Path $path)"
    }
    elseif (Test-Path (Join-Path -Path $config.attributes.work_dir -ChildPath $path)) {
      $path = "$(Join-Path -Path $config.attributes.work_dir -ChildPath $path)"
    }
    elseif (Test-Path (Join-Path -Path $config.attributes.pwshake_path -ChildPath $path)) {
      $path = "$(Join-Path -Path $config.attributes.pwshake_path -ChildPath $path)"
    }
    else {
      if (!$Unresolved) {
        throw "Unknown path: $path"
      }
      else {
        if ([IO.Path]::GetPathRoot($path) -notin [IO.Directory]::GetLogicalDrives()) {
          $path = Join-Path $config.attributes.pwshake_path $path
        }
        elseif (${is-Linux} -and ($path -notmatch '^/.*')) {
          $path = Join-Path $config.attributes.pwshake_path $path
        }
        $path = "$($path | f-cnvp)"
      }
    }

    "Build-Path:Out:`$path = $path" | f-log-dbg
    return $path
  }
}