scripts/Load-Config.ps1

function Load-Config {
    [CmdletBinding()]
    param (
        [Parameter(Position = 0, Mandatory = $false, ValueFromPipeline = $true)]
        [hashtable]$config = @{},

        [Parameter(Position = 1, Mandatory = $true)]
        [string]$ConfigPath,

        [Parameter(Position = 2, Mandatory = $false)]
        [object]$MetaData = $null,

        [Parameter(Mandatory = $false)]
        [bool]$DryRun = $false,

        [Parameter(Mandatory = $false)]
        [string]$Verbosity = 'Default'
    )
    process {
        $config = $ConfigPath | Build-FromYaml | Build-Config

        $config.attributes.pwshake_path = "$(Split-Path $ConfigPath -Resolve)"
        $config.attributes.pwshake_log_path = (Join-Path -Path $config.attributes.pwshake_path -ChildPath "$((Resolve-Path $ConfigPath | Get-Item).BaseName).log").ToString()
        $config.attributes.pwshake_module_path = "$(${global:pwshake-context}.module.path)"
        $config.attributes.pwshake_version = "$(${global:pwshake-context}.module.version)"
        $config.attributes.work_dir = "$(Get-Location)"
        $config.attributes.pwshake_verbosity = $Verbosity
        if ($DryRun) {
            $config.attributes.pwshake_dry_run = $DryRun
        }

        if (-not $config.scripts_directories.Count) {
            $config.scripts_directories = @('.')
        }
        elseif (-not $config.scripts_directories.Contains('.')) {
            $config.scripts_directories += '.'
        }
        elseif (-not $config.scripts_directories.Contains('scripts')) {
            $config.scripts_directories += 'scripts'
        }

        if (Test-Path $config.attributes.pwshake_log_path) {
            Remove-Item -Path $config.attributes.pwshake_log_path -Force
        }
        if (Test-Path "$($config.attributes.pwshake_log_path).json") {
            Remove-Item -Path "$($config.attributes.pwshake_log_path).json" -Force
        }

        return $config
    }
}