Public/Set-DotsConfig.ps1

function Set-DotsConfig {
    <#
    .SYNOPSIS
        Set Dots module configuration

    .DESCRIPTION
        Set Dots module configuration, and $DotsConfig module variable

    .PARAMETER CMDBPrefix
        Prefix for Dots-owned data, when multiple data sources are present

    .PARAMETER ScriptsPath
        Path to scripts that pull external and Dots data
        Must include scripts in respective subfolders: ExternalSources, DotsSources

        If more than one ScriptsPath is specified and duplicate script names are found,
        we pick the first script found

    .PARAMETER IncludeDotsScripts
        Whether to include Dots/Scripts in functions that use ScriptsPath
        Defaults to $true

    .PARAMETER DataPath
        Path to yaml data where Dots is the source of truth

    .PARAMETER ScriptOrder
        Controls order of ScriptsPath script execution
        Items not included run last
        Required in cases where data must exist first - e.g. start and end nodes for a relationship

    .PARAMETER ScriptsToRun
        Specify a whitelist of scripts that Dots will run
        All other scripts will be ignored

    .PARAMETER ScriptsToIgnore
        Specify a blacklist of scripts that Dots will ignore
        All other scripts will run

    .PARAMETER ServerUnique
        Unique identifier for a :Server. Used to correlate and to avoid duplicates

    .PARAMETER TestMode
        If specified, we generate Dots from pre-existing mock data

    .PARAMETER Path
        If specified, save config file to this file path
        Defaults to
          * DotsConfig.xml in the user temp folder on Windows, or
          * .dotsconfig in the user's home directory on Linux/macOS

    .FUNCTIONALITY
        Dots
    #>

    [cmdletbinding()]
    param(
        [string]$CMDBPrefix,
        [string[]]$DataPath,
        [string[]]$ScriptsPath,
        [bool]$IncludeDotsScripts,
        [string[]]$ScriptOrder,
        [string[]]$ScriptsToRun,
        [string[]]$ScriptsToIgnore,
        [string]$ServerUnique,
        [switch]$TestMode,
        [string]$Path = $script:_DotsConfigXmlpath
    )

    Switch ($PSBoundParameters.Keys)
    {
        'CMDBPrefix'         { $Script:DotsConfig.CMDBPrefix = $CMDBPrefix }
        'DataPath'           { $Script:DotsConfig.DataPath = [string[]]$DataPath }
        'ScriptsPath'        { $Script:DotsConfig.ScriptsPath = [string[]]$ScriptsPath }
        'IncludeDotsScripts' { $Script:DotsConfig.IncludeDotsScripts = $IncludeDotsScripts }
        'ScriptOrder'        { $Script:DotsConfig.ScriptOrder = [string[]]$ScriptOrder }
        'ScriptsToRun'       { $Script:DotsConfig.ScriptsToRun = [string[]]$ScriptsToRun }
        'ScriptsToIgnore'    { $Script:DotsConfig.ScriptsToIgnore = [string[]]$ScriptsToIgnore }
        'ServerUnique'       { $Script:DotsConfig.ServerUnique = $ServerUnique }
        'TestMode'           { $Script:DotsConfig.TestMode = [bool]$TestMode }
    }
    # Create variables for config props, for convenience
    foreach($Prop in $DotsProps) {
        Set-Variable -Name $Prop -Value $DotsConfig.$Prop -Scope Script -Force
    }

    $SelectParams = @{
        Property = $Script:DotsProps
    }
    if(-not (Test-IsWindows)) {
        $SelectParams.Add('ExcludeProperty', 'Credential')
    }
    #Write the global variable and the xml
    $Script:DotsConfig |
        Select-Object @SelectParams |
        Export-Clixml -Path $Path -Force
}