internal/functions/configuration/Convert-PsfConfigValue.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function Convert-PsfConfigValue
{
<#
 .SYNOPSIS
  Converts a persisted configuration's value back to its data type.
  
 .DESCRIPTION
  Converts a persisted configuration's value back to its data type.
  Can be used for either registry-based or json-file-based items.
  
 .PARAMETER Value
  The full value item to decode (must include the original type identifier).
  Example:
    "bool:true"
  
 .EXAMPLE
  PS C:\> Convert-PsfConfigValue -Value "bool:true"
  
  Will return a boolean $true
#>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseOutputTypeCorrectly", "")]
    [CmdletBinding()]
    Param (
        [string]
        $Value
    )
    
    begin
    {
        
    }
    process
    {
        $index = $Value.IndexOf(":")
        if ($index -lt 1) { throw "No type identifier found!" }
        $type = $Value.Substring(0, $index).ToLower()
        $content = $Value.Substring($index + 1)
        
        switch ($type)
        {
            "bool"
            {
                if ($content -eq "true") { return $true }
                if ($content -eq "1") { return $true }
                if ($content -eq "false") { return $false }
                if ($content -eq "0") { return $false }
                throw "Failed to interpret as bool: $content"
            }
            "int" { return ([int]$content) }
            "double" { return [double]$content }
            "long" { return [long]$content }
            "string" { return $content }
            "timespan" { return (New-Object System.TimeSpan($content)) }
            "datetime" { return (New-Object System.DateTime($content)) }
            "consolecolor" { return ([System.ConsoleColor]$content) }
            "array"
            {
                if ($content -eq "") { return, @() }
                $tempArray = @()
                foreach ($item in ($content -split "þþþ"))
                {
                    $tempArray += Convert-PsfConfigValue -Value $item
                }
                return, $tempArray
            }
            
            default { throw "Unknown type identifier" }
        }
    }
    end
    {
    
    }
}