internal/functions/templateFunctions/Assert-TemplateFunctions.ps1
function Assert-TemplateFunctions { [CmdletBinding()] Param ( [Parameter(Mandatory = $true)] [string] $InputTemplate ) begin { function Check-StringMappingsExists { Param ( [Parameter(Mandatory = $true)] [string] $StringMappingName ) if ($StringMappingName -in $script:desiredConfiguration["stringMappings"].name) { return $true } return $false } function Get-ValueFromStringMappings { Param ( [Parameter(Mandatory = $true)] [string] $StringMappingName ) if (Check-StringMappingsExists -StringMappingName $StringMappingName) { return ($script:desiredConfiguration["stringMappings"] | Where-Object {$_.name -eq $StringMappingName}).replace } return $StringMappingName } [regex] $functionRegex = "(?<pre_comma>,?)\n?\s*`"?(?<to_replace>{% (?<function>for|if) (?<statement>[\w\s\'\-_]*) %}\s?(?<output>[\w\s\-_!§`$&\/\(\)=\?\\`"\[\]@.:,{}]*)\s?{% (endfor|endif) %})`"?" [regex] $ifStatementRegex = "\'?(?<left>[\w\-_]+)\'? (?<operator>eq|ne) \'?(?<right>[\w\-_]+)\'?" } process { $functionMatches = $functionRegex.Matches($InputTemplate) if ($functionMatches.count -eq 0) { Write-Debug "Found $($functionMatches.count) matches" $InputTemplate return } foreach ($functionMatch in ($functionMatches | Sort-Object -Unique Value )) { # If the same function is used multiple times, we only evaluate it once. We replace all recurrences. Write-Debug "Found function $functionMatch" switch ($functionMatch.Groups["function"].Value) { "if" { Write-Debug "Is an if-function" $statementMatch = $ifStatementRegex.Match($functionMatch.Groups["statement"].Value) $left = if ($statementMatch.Groups["left"].value -notlike "'*'") { Get-ValueFromStringMappings -StringMappingName $statementMatch.Groups["left"].Value } else { $statementMatch.Groups["left"].value } $right = if ($statementMatch.Groups["right"].value -notlike "'*'") { Get-ValueFromStringMappings -StringMappingName $statementMatch.Groups["right"].Value } else { $statementMatch.Groups["right"].value } switch ($statementMatch.Groups["operator"].Value) { "eq" { Write-Debug "Operator is eq" if ($left -eq $right) { Write-Debug "Statement is '$statementMatch' returns true. Replacing with output value" Write-Debug "Replacing $($functionMatch.Groups["to_replace"].Value) with $($functionMatch.Groups["output"].Value)" $InputTemplate = $InputTemplate.replace($functionMatch.Groups["to_replace"].Value, $functionMatch.Groups["output"].Value) } else { Write-Debug "Statement is '$statementMatch' returns false. Replacing with empty" $InputTemplate = $InputTemplate.replace($functionMatch.Value, "") } } "ne" { Write-Debug "Operator is ne" if ($left -ne $right) { Write-Debug "Output value: $($functionMatch.Groups["output"].Value)" Write-Debug "Replacing $($functionMatch.Groups["to_replace"].Value) with $($functionMatch.Groups["output"].Value)" $InputTemplate = $InputTemplate.replace($functionMatch.Groups["to_replace"].Value, $functionMatch.Groups["output"].Value) } else { Write-Debug "Statement is '$statementMatch' returns false. Replacing with empty" $InputTemplate = $InputTemplate.replace($functionMatch.Value, "") } } } } } } $InputTemplate } } |