scripts/Arrange-Tasks.ps1

function Arrange-Tasks {
  [CmdletBinding()]
  param (
    [Parameter(Position = 0, Mandatory = $true, ValueFromPipeline = $true)]
    [object[]]$depends_on,

    [Parameter(Mandatory = $false)]
    [hashtable]$config = (Peek-Config),

    [Parameter(Mandatory = $false)]
    [int]$depth = 0
  )
  process {
    if ($depth -gt ${global:pwshake-context}.options.max_depth) {
      throw "Circular reference detected for dependant tasks in: $depends_on"
    }

    $tasks = @()

    foreach ($name in $depends_on) {
      "Arrange-Tasks:foreach:`$name:`n$(cty $name)" | f-log-dbg
      if (-not ($config.tasks.Keys -contains $name)) {
        throw "Task '$name' is undefined in the PWSHAKE config."
      }

      $task = Build-Task $config.tasks[$name] $name

      if ($task.depends_on) {
        $tasks += ($task.depends_on | Arrange-Tasks -depth ($depth + 1))
      }

      $tasks += $task
    }

    "Arrange-Tasks:Out:`$tasks:`n$(cty $tasks)" | f-log-dbg
    return $tasks
  }
}