Private/Container/ConvertTo-NAVGitContainerParameters.ps1

function ConvertTo-NAVGitContainerParameters {
    <#
    .SYNOPSIS
        Builds the splat for New-BcContainer from the configuration and the resolved artifact, backup, license and
        credential. Pure function: no I/O. Everything that has a native New-BcContainer parameter is passed as one;
        additionalParameters only carries what is left (validated by Assert-NAVGitAdditionalParameters).
    #>

    [CmdletBinding()]
    [OutputType([hashtable])]
    param(
        [Parameter(Mandatory)]
        [hashtable] $Config,

        [Parameter(Mandatory)]
        $ArtifactInfo,

        # Result of Resolve-NAVGitBackupFile (Path = $null means the Cronus demo database).
        [Parameter(Mandatory)]
        $Backup,

        [AllowNull()]
        [AllowEmptyString()]
        [string] $LicenseFile,

        [Parameter(Mandatory)]
        [pscredential] $Credential,

        # Existing host folder with .NET add-ins; mapped to c:\run\Add-ins (as AdvaniaGIT's mapAddInFolder did).
        [string] $AddInsFolder,

        [string] $UserDomain = $env:USERDOMAIN
    )

    $major = $ArtifactInfo.Version.Major
    if ($major -lt 9 -or $major -gt 14) {
        throw "Version $($ArtifactInfo.Version) is not supported. NAVGit supports NAV 2016 (9.0) to BC14 (14.x)."
    }

    $auth = Get-NAVGitEffectiveAuth -Auth $Config.auth -UserDomain $UserDomain

    if ($Config.enableSymbolLoading -and $major -lt 11) {
        throw "enableSymbolLoading requires NAV 2018 (11.0) or later; the artifact is $($ArtifactInfo.Version)."
    }

    $additionalParameters = @($Config.additionalParameters | Where-Object { $_ })
    Assert-NAVGitAdditionalParameters -AdditionalParameters $additionalParameters
    if ($AddInsFolder) {
        $additionalParameters += "--volume `"$($AddInsFolder):c:\run\Add-ins`""
    }

    $params = [ordered]@{
        accept_eula              = $true
        accept_outdated          = $true
        containerName            = $Config.containerName
        artifactUrl              = $ArtifactInfo.Url
        imageName                = $Config.imageName
        auth                     = $auth
        Credential               = $Credential
        includeCSide             = $true
        doNotExportObjectsToText = $true
        updateHosts              = [bool]$Config.updateHosts
        shortcuts                = $Config.shortcuts
        restart                  = 'unless-stopped'
    }

    if ($Backup.Path) {
        $params.bakFile = $Backup.Path
    }
    if ($LicenseFile) {
        $params.licenseFile = $LicenseFile
    }
    if ($Config.isolation) {
        $params.isolation = $Config.isolation
    }
    if ($Config.memoryLimit) {
        $params.memoryLimit = $Config.memoryLimit
    }
    if ($Config.dns) {
        $params.dns = $Config.dns
    }
    if ($Config.enableSymbolLoading) {
        $params.enableSymbolLoading = $true
    }
    if ($Config.includeTestToolkit) {
        $params.includeTestToolkit = $true
        if ($Config.testToolkit.librariesOnly) {
            $params.includeTestLibrariesOnly = $true
        }
    }
    $myScripts = @($Config.myScripts | Where-Object { $_ })
    if ($myScripts.Count -gt 0) {
        $params.myScripts = $myScripts
    }
    if ($additionalParameters.Count -gt 0) {
        $params.additionalParameters = $additionalParameters
    }

    # Return a plain hashtable (splatting works with both, but tests and callers expect [hashtable]).
    $result = @{}
    foreach ($key in $params.Keys) { $result[$key] = $params[$key] }
    return $result
}

function Format-NAVGitContainerCommand {
    <#
    .SYNOPSIS
        Renders a New-BcContainer splat as readable PowerShell, with the credential masked.
    #>

    [CmdletBinding()]
    [OutputType([string])]
    param(
        [Parameter(Mandatory)]
        [hashtable] $Parameters
    )

    $order = @('accept_eula', 'accept_outdated', 'containerName', 'artifactUrl', 'imageName', 'bakFile', 'licenseFile',
        'auth', 'Credential', 'isolation', 'memoryLimit', 'dns', 'includeCSide', 'doNotExportObjectsToText',
        'enableSymbolLoading', 'includeTestToolkit', 'includeTestLibrariesOnly', 'updateHosts', 'shortcuts', 'restart',
        'myScripts', 'additionalParameters')
    $keys = @($order | Where-Object { $Parameters.ContainsKey($_) }) + @($Parameters.Keys | Where-Object { $order -notcontains $_ } | Sort-Object)

    $lines = @('New-BcContainer')
    foreach ($key in $keys) {
        $value = $Parameters[$key]
        if ($value -is [bool]) {
            if ($value) { $lines += "-$key" } else { $lines += "-${key}:`$false" }
        }
        elseif ($value -is [pscredential]) {
            $lines += "-$key (credential for '$($value.UserName)', password hidden)"
        }
        elseif ($value -is [array]) {
            $lines += "-$key @($(($value | ForEach-Object { "'$($_ -replace "'", "''")'" }) -join ', '))"
        }
        else {
            $lines += "-$key '$($value -replace "'", "''")'"
        }
    }
    return ($lines -join " ``$([Environment]::NewLine) ")
}