functions/public/Update-PSWorkItemPreference.ps1

Function Update-PSWorkItemPreference {
    [cmdletbinding(SupportsShouldProcess)]
    [OutputType('System.IO.FileInfo','None')]
    Param(
        [Parameter(HelpMessage = "Specify the default category for new PSWorkItems")]
        [ValidateNotNullOrEmpty()]
        [ArgumentCompleter({
            (Get-PSWorkItemData -Table Categories -Path $global:PSWorkItemPath).Category |
            ForEach-Object { [CultureInfo]::CurrentCulture.TextInfo.ToTitleCase($_) } |
            Select-Object -Unique | Sort-Object
        })]
        [ValidateScript(
            { (Get-PSWorkItemData -Table Categories -Path $global:PSWorkItemPath).Category -Contains $_ },
            ErrorMessage = "You entered an invalid category."
        )]
        [string]$DefaultCategory,

        [Parameter(
            HelpMessage = "Update PSWorkitem user preferences settings file."
        )]
        [ValidateNotNullOrEmpty()]
        [Switch]$Passthru
    )

    Begin {
        StartTimer
        $PSDefaultParameterValues["_verbose:Command"] = $MyInvocation.MyCommand
        $PSDefaultParameterValues["_verbose:block"] = "Begin"
        _verbose -message $strings.Starting
        if ($MyInvocation.CommandOrigin -eq 'Runspace') {
            #Hide this metadata when the command is called from another command
            _verbose -message ($strings.PSVersion -f $PSVersionTable.PSVersion)
            _verbose -message ($strings.UsingHost -f $host.Name)
            _verbose -message ($strings.UsingOS -f $PSVersionTable.OS)
            _verbose -message ($strings.UsingModule -f $ModuleVersion)
            _verbose -message ($strings.UsingDB -f $path)
            _verbose ($strings.DetectedCulture -f (Get-Culture))
        }
        $FilePath = Join-Path -Path $HOME -ChildPath ".psworkitempref.json"
    } #begin

    Process {
        $PSDefaultParameterValues["_verbose:block"] = "Process"
        _verbose -message $strings.UpdatePreference
        #export global variables
        $pref = [PSCustomObject]@{
            Path = $global:PSWorkItemPath
            DefaultDays = $global:PSWorkItemDefaultDays
            DefaultCategory = $DefaultCategory
            Categories = $global:PSWorkItemCategory.GetEnumerator() |
            ForEach-Object { @{Category = $_.Key;ANSI = $_.value}}
        }
        _verbose -message ($strings.SavingPreference -f $FilePath)
        _verbose -message "$($pref | Select-Object Path,DefaultDays,DefaultCategory | Out-String)`nCategories:`n$($pref.Categories.Category | Out-String)"
        Try {
            $pref | ConvertTo-Json | Out-File -FilePath $FilePath -ErrorAction Stop
        }
        Catch {
            Throw $_
        }

        if ($Passthru -AND (Test-Path $FilePath) -AND (-Not $WhatIfPreference)) {
            Get-Item -path $FilePath
        }
    } #process

    End {
        $PSDefaultParameterValues["_verbose:block"] = "End"
        $PSDefaultParameterValues["_verbose:Command"] = $MyInvocation.MyCommand
        _verbose -message $strings.Ending
        _verbose -message ($strings.RunTime -f (StopTimer))
    } #end

} #close Update-PSWorkItemPreference