functions/Get-DBOConfig.ps1

function Get-DBOConfig {
    <#
    .SYNOPSIS
    Returns a DBOpsConfig object
     
    .DESCRIPTION
    Returns a DBOpsConfig object from an existing json file. If file was not specified, returns a blank DBOpsConfig object.
    Values of the config can be overwritten by the hashtable parameter -Configuration.
     
    .PARAMETER Path
    Path to the JSON config file.
 
    .PARAMETER InputObject
    Object to get the configuration from.
         
    .PARAMETER Configuration
    Overrides for the configuration values. Will replace existing configuration values.
 
    .PARAMETER Confirm
    Prompts to confirm certain actions
 
    .PARAMETER WhatIf
    Shows what would happen if the command would execute, but does not actually perform the command
 
    .EXAMPLE
    # Returns configuration from existing file
    Get-DBOConfig c:\package\dbops.config.json
 
    .EXAMPLE
    # Returns configuration overriding ConnectionTimeout
    Get-DBOConfig c:\package\dbops.config.json -Configuration @{ ConnectionTimeout = 5 }
 
    #>

    [CmdletBinding(DefaultParameterSetName = 'Path')]
    param
    (
        [parameter(Mandatory, ParameterSetName = 'Path', Position = 1)]
        [string]$Path,
        [parameter(Mandatory, ParameterSetName = 'Pipeline', ValueFromPipeline)]
        $InputObject,
        [object]$Configuration
    )
    if ($PsCmdlet.ParameterSetName -eq 'Path') {
        $config = [DBOpsConfig]::FromFile($Path)
    }
    elseif ($PsCmdlet.ParameterSetName -eq 'Pipeline') {
        if ($InputObject -is [DBOpsConfig]) {
            $config = $InputObject
        }
        else {
            # assuming it's a package - file or else
            $package = Get-DBOPackage -InputObject $InputObject
            $config = $package.Configuration
        }
    }
    if (Test-PSFParameterBinding -ParameterName Configuration) {
        if ($Configuration -is [DBOpsConfig] -or $Configuration -is [hashtable]) {
            Write-PSFMessage -Level Verbose -Message "Merging configuration from a $($Configuration.GetType().Name) object"
            $config.Merge($Configuration)
        }
        elseif ($Configuration -is [String] -or $Configuration -is [System.IO.FileInfo]) {
            $configFromFile = Get-DBOConfig -Path $Configuration
            Write-PSFMessage -Level Verbose -Message "Merging configuration from file $($Configuration)"
            $config.Merge($configFromFile)
        }
        elseif ($Configuration) {
            Stop-PSFFunction -EnableException $true -Message "The following object type is not supported: $($Configuration.GetType().Name). The only supported types are DBOpsConfig, Hashtable, FileInfo and String"
        }
    }
    return $config
}