property/Merge-PropertyRuleTemplates.ps1

<#
.SYNOPSIS
Akamai Powershell - Expanding json templates
.DESCRIPTION
Expands a single #include: statement by fetching the file and converting to PS object. You should not execute this directly, it should only be called by Merge-PropertyRuleTemplates
.PARAMETER Include
Include statement from json file
.PARAMETER Path
Folder path to prepend to include statement in order to find the file
.EXAMPLE
Expand-ChildRuleTemplate -Include "include:offload/offload.json" -Path "/property/"
.LINK
developer.akamai.com
#>


function Expand-ChildRuleTemplate {
    Param(
        [Parameter(Mandatory=$true)]  [string] $Include,
        [Parameter(Mandatory=$true)]  [string] $Path
    )

    $OSSlashChar = Get-OSSlashCharacter
    $IncludePath = $Path + $OSSlashChar + $Include.Replace("#include:","")
    $IncludeDir = $IncludePath.SubString(0,$IncludePath.LastIndexOf($OSSlashChar))
    Write-Debug "Expanding include $IncludePath"
    $Child = Get-Content $IncludePath -Raw | ConvertFrom-Json

    for($i = 0; $i -lt $Child.children.count; $i++){
        if($Child.children[$i].GetType().Name -eq 'String' -and $Child.children[$i].StartsWith('#include:')){
            $Child.children[$i] = Expand-ChildRuleTemplate -Include $Child.children[$i] -Path $IncludeDir
        }
    }

    return $Child
}

<#
.SYNOPSIS
Akamai Powershell - Expanding json templates
.DESCRIPTION
Expands a single #include: statement by fetching the file and converting to PS object. You should not execute this directly, it should only be called by Merge-PropertyRuleTemplates
.PARAMETER SourceDirectory
Folder to read property snippets from
.PARAMETER DefaultRuleFilename
Filename of json file holding default rule. Defaults to 'main.json'
.PARAMETER OutputToFile
Switch to output a json file
.PARAMETER OutputFileName
Filename to write rules to. Defaults to <foldername>.json
.EXAMPLE
Merge-PropertyRuleTemplates -SourceDirectory /property -OutputToFile -OutputFileName rules.json
.LINK
developer.akamai.com
#>


function Merge-PropertyRuleTemplates {
    Param(
        [Parameter(Mandatory=$true)]  [string] $SourceDirectory,
        [Parameter(Mandatory=$false)] [string] $DefaultRuleFilename = 'main.json',
        [Parameter(Mandatory=$false)] [switch] $OutputToFile,
        [Parameter(Mandatory=$false)] [string] $OutputFileName
    )

    $OSSlashChar = Get-OSSlashCharacter

    if(!(Test-Path "$SourceDirectory$OSSlashChar$DefaultRuleFilename")){
        throw "Default rule file '$SourceDirectory$OSSlashChar$DefaultRuleFilename' not found"
    }
    else{
        $Source = Get-Item $SourceDirectory
    }

    if($PSVersionTable.PSVersion.Major -gt 5){
        $Rules = Get-Content -Raw "$($Source.FullName)$OSSlashChar$DefaultRuleFilename" | ConvertFrom-Json -Depth 100
    }
    else{
        $Rules = Get-Content -Raw "$($Source.FullName)$OSSlashChar$DefaultRuleFilename" | ConvertFrom-Json
    }
    

    ## Get Variables
    $VariablesFileName = $Rules.variables.Replace("#include:","")
    if($PSVersionTable.PSVersion.Major -gt 5){
        $Rules.variables = Get-Content -Raw "$($Source.FullName)$OSSlashChar$VariablesFileName" | ConvertFrom-Json -Depth 100
    }
    else{
        # PS 5 does odd things with array-based json files so we have to trick it
        $Rules.variables = @()
        $Variables = Get-Content -Raw "$($Source.FullName)$OSSlashChar$VariablesFileName" | ConvertFrom-Json
        $Rules.variables += $Variables
    }
    

    for($i = 0; $i -lt $Rules.children.count; $i++){
        if($Rules.children[$i].GetType().Name -eq 'String' -and $Rules.children[$i].StartsWith('#include:')){
            $Rules.children[$i] = Expand-ChildRuleTemplate -Include $Rules.children[$i] -Path $Source.FullName
        }
    }

    $Output = New-Object -TypeName PSCustomObject
    $Output | Add-Member -MemberType NoteProperty -Name rules -Value $Rules

    if($OutputToFile){
        if($OutputFileName -eq ''){
            $OutputFileName = $Source.Name + '.json'
        }
        Write-Host "Combined contents of " -NoNewline
        Write-Host -ForegroundColor Green $SourceDirectory -NoNewline
        Write-Host " into " -NoNewline
        Write-Host -ForegroundColor Green $OutputFileName
        $Output | ConvertTo-Json -Depth 100 | Out-File $OutputFileName
    }
    else{
        return $Output
    }
}