scripts/Invoke-pwshake.ps1

function Invoke-pwshake {
    [CmdletBinding()]
    param (
        [Parameter(Position = 0, Mandatory = $false)]
        [string]$ConfigPath = ".\pwshake.yaml",
    
        [Parameter(Position = 1, Mandatory = $false)]
        [Alias("RunLists", "Roles")]
        [object[]]$Tasks = @(),
    
        [Parameter(Position = 2, Mandatory = $false)]
        [object]$MetaData = $null,

        [Alias("WhatIf", "Noop")]
        [switch]$DryRun
    )
    process {
        $config = Load-Config $ConfigPath `
                    | Merge-Includes -yamlPath $ConfigPath `
                    | Merge-Metadata -metadata $MetaData -tasks $Tasks -yamlPath $ConfigPath `
                    | Override-Attributes `
                    | Interpolate-Attributes

        Log-Output "PWSHAKE config:" $config 6>&1
        Log-Output "$(ConvertTo-Yaml $config)" $config 6>&1

        $arranged_tasks = Arrange-Tasks $config
        Log-Output "Arranged tasks:" $config 6>&1
        Log-Output "$(ConvertTo-Yaml $arranged_tasks)" $config 6>&1

        try {
            Push-Location $config.attributes.work_dir
            foreach ($task in $arranged_tasks) {
                Invoke-Task $task $config $dryRun
            }
        } finally {
            Pop-Location
        }
    }
}