functions/features-serialization.ps1

function Write-CecFeatureConfig {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline, Mandatory)]$Features,
        [Parameter(Mandatory)][String]$Path,
        [Switch]$Subfolder
    )

    begin {
        if ($Subfolder) {
            $folder = Join-Path $Path "features" 
        }
        else {
            $folder = Resolve-Path $Path
        }
    }

    process {

        Write-Verbose "## Writing features to $folder"
        foreach ($area in $Features.PSObject.Properties.Name) {
            if ($area -eq "enabled") { continue }
            Write-Verbose "### Writing $area"
            foreach ($fname in $Features.$area.PSObject.Properties.Name) {
                $relativeFolder = "features/${area}/${fname}"
                $folder = Join-Path $Path $relativeFolder
                If (-not (Test-Path $folder -PathType Container)) { New-Item $folder -ItemType Directory -Force | Out-Null }

                Write-Verbose "#### Writing $area.$fname to $folder"

                foreach ($obj in $Features.$area.$fname) {
                    if( $obj.PSObject.Properties.Name -contains "name" ) {
                        $name = $obj.name
                    }
                    else {
                        $name = $fname
                    }

                    $filename = Join-Path $folder "${name}.json"
                    Set-Content -Path $filename -Value ($obj | ConvertTo-Json -Depth 15)
                }
            }
            
            $Features.$area = "Exported to $relativeFolder"
            Write-Verbose "### Writing $area completed"
        }

        $json = $Features | ConvertTo-Json -Depth 15
        $filePath = Join-Path $Path "features/features.json"
        Set-Content -LiteralPath $filePath -Value $json -Force
    }
}