-
-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Porting Bash Template to Language Function (Fixes #589)
- Loading branch information
James Brundage
committed
Nov 11, 2023
1 parent
c51e681
commit 9634f98
Showing
1 changed file
with
35 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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})" | ||
} | ||
|