Skip to content

Commit

Permalink
feat: Porting Bash Template to Language Function (Fixes #589)
Browse files Browse the repository at this point in the history
  • Loading branch information
James Brundage committed Nov 11, 2023
1 parent c51e681 commit 9634f98
Showing 1 changed file with 35 additions and 76 deletions.
111 changes: 35 additions & 76 deletions Commands/Languages/Bash/Bash-Language.ps.ps1
Original file line number Diff line number Diff line change
@@ -1,86 +1,45 @@
<#
.SYNOPSIS
Bash Template Transpiler.
.DESCRIPTION
Allows PipeScript to generate Bash scripts.
Language function Bash {
<#
.SYNOPSIS
Bash Language Definition
.DESCRIPTION
Defines Bash within PipeScript.
Heredocs named PipeScript{} will be treated as blocks of PipeScript.
This allows Rust to be templated.
```bash
<<PipeScript{}
# This will be considered PipeScript / PowerShell, and will return the contents of a bash script.
PipeScript{}
```
.EXAMPLE
Invoke-PipeScript {
$bashScript = @'
echo 'hello world'
Heredocs named PipeScript{} will be treated as blocks of PipeScript.
```bash
<<PipeScript{}
"echo '$('hi','yo','sup' | Get-Random)'"
PipeScript{}
'@
[OutputFile('.\HelloWorld.ps1.sh')]$bashScript
}
Invoke-PipeScript .\HelloWorld.ps1.sh
#>
[ValidatePattern('\.sh$')]
param(
# The command information. This will include the path to the file.
[Parameter(Mandatory,ValueFromPipeline,ParameterSetName='TemplateFile')]
[Management.Automation.CommandInfo]
$CommandInfo,

# If set, will return the information required to dynamically apply this template to any text.
[Parameter(Mandatory,ParameterSetName='TemplateObject')]
[switch]
$AsTemplateObject,

# A dictionary of parameters.
[Collections.IDictionary]
$Parameter,

# A list of arguments.
[PSObject[]]
$ArgumentList
)
# This will be considered PipeScript / PowerShell, and will return the contents of a bash script.
begin {
PipeScript{}
```
.EXAMPLE
Invoke-PipeScript {
$bashScript = '
echo ''hello world''
<<PipeScript{}
"echo ''$(''hi'',''yo'',''sup'' | Get-Random)''"
PipeScript{}
'
[OutputFile('.\HelloWorld.ps1.sh')]$bashScript
}
Invoke-PipeScript .\HelloWorld.ps1.sh
#>
[ValidatePattern('\.sh$')]
param(
)
# We start off by declaring a number of regular expressions:
$startComment = '(?>\<\<PipeScript\{\})'
$endComment = '(?>PipeScript\{\})'
# * StartRegex ```$StartComment + '{' + $Whitespace```
$startRegex = "(?<PSStart>${startComment})"
# * EndRegex ```$whitespace + '}' + $EndComment```
$endRegex = "(?<PSEnd>${endComment})"

# Create a splat containing arguments to the core inline transpiler
$Splat = [Ordered]@{
StartPattern = $startRegex
EndPattern = $endRegex
}
}

process {
# If we have been passed a command
if ($CommandInfo) {
# add parameters related to the file.
$Splat.SourceFile = $commandInfo.Source -as [IO.FileInfo]
$Splat.SourceText = [IO.File]::ReadAllText($commandInfo.Source)
}

if ($Parameter) { $splat.Parameter = $Parameter }
if ($ArgumentList) { $splat.ArgumentList = $ArgumentList }

# If we are being used within a keyword,
if ($AsTemplateObject) {
$splat # output the parameters we would use to evaluate this file.
} else {
# Otherwise, call the core template transpiler
.>PipeScript.Template @Splat # and output the changed file.
}
$StartPattern = "(?<PSStart>${startComment})"

$EndPattern = "(?<PSEnd>${endComment})"
}

0 comments on commit 9634f98

Please sign in to comment.