module/parameter.psm1
#Requires -PSEdition Core -Version 7.2 Import-Module -Name @( (Join-Path -Path $PSScriptRoot -ChildPath 'command-file.psm1'), (Join-Path -Path $PSScriptRoot -ChildPath 'log.psm1') ) -Prefix 'GitHubActions' -Scope 'Local' <# .SYNOPSIS GitHub Actions - Clear Output .DESCRIPTION Clear the outputs that set in the current step. .OUTPUTS [Void] #> Function Clear-Output { [CmdletBinding(HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_cleargithubactionsoutput')] [OutputType([Void])] Param () Clear-GitHubActionsFileCommand -FileCommand 'GITHUB_OUTPUT' } Set-Alias -Name 'Remove-Output' -Value 'Clear-Output' -Option 'ReadOnly' -Scope 'Local' <# .SYNOPSIS GitHub Actions - Clear State .DESCRIPTION Clear the states that set in the current step. .OUTPUTS [Void] #> Function Clear-State { [CmdletBinding(HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_cleargithubactionsstate')] [OutputType([Void])] Param () Clear-GitHubActionsFileCommand -FileCommand 'GITHUB_STATE' } Set-Alias -Name 'Remove-State' -Value 'Clear-State' -Option 'ReadOnly' -Scope 'Local' <# .SYNOPSIS GitHub Actions - Get Input .DESCRIPTION Get input. .PARAMETER Name Name of the input. .PARAMETER Mandatory Whether the input is mandatory; If mandatory but not exist, will throw an error. .PARAMETER MandatoryMessage Message when the input is mandatory but not exist. .PARAMETER NamePrefix Name of the inputs start with. .PARAMETER NameSuffix Name of the inputs end with. .PARAMETER All Whether to get all of the inputs. .PARAMETER Trim Whether to trim the value of the input(s). .OUTPUTS [Hashtable] Inputs. [String] Value of the input. #> Function Get-Input { [CmdletBinding(DefaultParameterSetName = 'One', HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_getgithubactionsinput')] [OutputType([String], ParameterSetName = 'One')] [OutputType([Hashtable], ParameterSetName = ('All', 'Prefix', 'Suffix'))] Param ( [Parameter(Mandatory = $True, ParameterSetName = 'One', Position = 0)][ValidatePattern('^(?:[\da-z][\da-z_-]*)?[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions input name!')][Alias('Key')][String]$Name, [Parameter(ParameterSetName = 'One')][Alias('Require', 'Required')][Switch]$Mandatory, [Parameter(ParameterSetName = 'One')][Alias('RequiredMessage', 'RequireMessage')][String]$MandatoryMessage = 'Input `{0}` is not defined!', [Parameter(Mandatory = $True, ParameterSetName = 'All')][Switch]$All, [Parameter(Mandatory = $True, ParameterSetName = 'Prefix')][ValidatePattern('^[\da-z][\da-z_-]*$', ErrorMessage = '`{0}` is not a valid GitHub Actions input name prefix!')][Alias('KeyPrefix', 'KeyStartWith', 'NameStartWith', 'Prefix', 'PrefixKey', 'PrefixName', 'StartWith', 'StartWithKey', 'StartWithName')][String]$NamePrefix, [Parameter(Mandatory = $True, ParameterSetName = 'Suffix')][ValidatePattern('^[\da-z_-]*[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions input name suffix!')][Alias('EndWith', 'EndWithKey', 'EndWithName', 'KeyEndWith', 'KeySuffix', 'NameEndWith', 'Suffix', 'SuffixKey', 'SuffixName')][String]$NameSuffix, [Switch]$Trim ) Switch ($PSCmdlet.ParameterSetName) { 'All' { [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path 'Env:\INPUT_*')) { $Result.($Item.Name -ireplace '^INPUT_', '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } 'One' { $InputValueRaw = [System.Environment]::GetEnvironmentVariable("INPUT_$($Name.ToUpper())") [AllowEmptyString()][AllowNull()][String]$InputValue = $Trim.IsPresent ? ($InputValueRaw)?.Trim() : $InputValueRaw If ([String]::IsNullOrEmpty($InputValue)) { If ($Mandatory.IsPresent) { Write-GitHubActionsFail -Message ($MandatoryMessage -f $Name) Throw } Return } $InputValue | Write-Output Return } 'Prefix' { [String]$InputNameReplaceRegEx = "^INPUT_$([RegEx]::Escape($NamePrefix.ToUpper()))" [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path "Env:\INPUT_$($NamePrefix.ToUpper())*")) { $Result.($Item.Name -ireplace $InputNameReplaceRegEx, '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } 'Suffix' { [String]$InputNameReplaceRegEx = "^INPUT_|$([RegEx]::Escape($NameSuffix.ToUpper()))$" [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path "Env:\INPUT_*$($NameSuffix.ToUpper())")) { $Result.($Item.Name -ireplace $InputNameReplaceRegEx, '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } } } <# .SYNOPSIS GitHub Actions - Get State .DESCRIPTION Get state. .PARAMETER Name Name of the state. .PARAMETER NamePrefix Name of the states start with. .PARAMETER NameSuffix Name of the states end with. .PARAMETER All Whether to get all of the states. .PARAMETER Trim Whether to trim the value of the state(s). .OUTPUTS [Hashtable] States. [String] Value of the state. #> Function Get-State { [CmdletBinding(DefaultParameterSetName = 'One', HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_getgithubactionsstate')] [OutputType([String], ParameterSetName = 'One')] [OutputType([Hashtable], ParameterSetName = ('All', 'Prefix', 'Suffix'))] Param ( [Parameter(Mandatory = $True, ParameterSetName = 'One', Position = 0)][ValidatePattern('^(?:[\da-z][\da-z_-]*)?[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions state name!')][Alias('Key')][String]$Name, [Parameter(Mandatory = $True, ParameterSetName = 'All')][Switch]$All, [Parameter(Mandatory = $True, ParameterSetName = 'Prefix')][ValidatePattern('^[\da-z][\da-z_-]*$', ErrorMessage = '`{0}` is not a valid GitHub Actions state name prefix!')][Alias('KeyPrefix', 'KeyStartWith', 'NameStartWith', 'Prefix', 'PrefixKey', 'PrefixName', 'StartWith', 'StartWithKey', 'StartWithName')][String]$NamePrefix, [Parameter(Mandatory = $True, ParameterSetName = 'Suffix')][ValidatePattern('^[\da-z_-]*[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions state name suffix!')][Alias('EndWith', 'EndWithKey', 'EndWithName', 'KeyEndWith', 'KeySuffix', 'NameEndWith', 'Suffix', 'SuffixKey', 'SuffixName')][String]$NameSuffix, [Switch]$Trim ) Switch ($PSCmdlet.ParameterSetName) { 'All' { [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path 'Env:\STATE_*')) { $Result.($Item.Name -ireplace '^STATE_', '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } 'One' { $StateValueRaw = [System.Environment]::GetEnvironmentVariable("STATE_$($Name.ToUpper())") $Trim.IsPresent ? ($StateValueRaw)?.Trim() : $StateValueRaw | Write-Output Return } 'Prefix' { [String]$StateNameReplaceRegEx = "^STATE_$([RegEx]::Escape($NamePrefix.ToUpper()))" [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path "Env:\STATE_$($NamePrefix.ToUpper())*")) { $Result.($Item.Name -ireplace $StateNameReplaceRegEx, '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } 'Suffix' { [String]$StateNameReplaceRegEx = "^STATE_|$([RegEx]::Escape($NameSuffix.ToUpper()))$" [Hashtable]$Result = @{} ForEach ($Item In (Get-ChildItem -Path "Env:\STATE_*$($NameSuffix.ToUpper())")) { $Result.($Item.Name -ireplace $StateNameReplaceRegEx, '') = $Trim.IsPresent ? ($Item.Value)?.Trim() : $Item.Value } $Result | Write-Output Return } } } Set-Alias -Name 'Restore-State' -Value 'Get-State' -Option 'ReadOnly' -Scope 'Local' <# .SYNOPSIS GitHub Actions - Set Output .DESCRIPTION Set output. .PARAMETER Name Name of the output. .PARAMETER Value Value of the output. .PARAMETER Optimize Whether to have an optimize operation by replace exist command instead of add command directly. .OUTPUTS [Void] #> Function Set-Output { [CmdletBinding(HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_setgithubactionsoutput')] [OutputType([Void])] Param ( [Parameter(Mandatory = $True, Position = 0, ValueFromPipelineByPropertyName = $True)][ValidatePattern('^(?:[\da-z][\da-z_-]*)?[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions output name!')][Alias('Key')][String]$Name, [Parameter(Mandatory = $True, Position = 1, ValueFromPipelineByPropertyName = $True)][AllowEmptyString()][AllowNull()][String]$Value, [Parameter(ValueFromPipelineByPropertyName = $True)][Switch]$Optimize ) Process { Write-GitHubActionsFileCommand -FileCommand 'GITHUB_OUTPUT' -Name $Name -Value $Value -Optimize:($Optimize.IsPresent) } } <# .SYNOPSIS GitHub Actions - Set State .DESCRIPTION Set state. .PARAMETER Name Name of the state. .PARAMETER Value Value of the state. .PARAMETER Optimize Whether to have an optimize operation by replace exist command instead of add command directly. .OUTPUTS [Void] #> Function Set-State { [CmdletBinding(HelpUri = 'https://github.com/hugoalh-studio/ghactions-toolkit-powershell/wiki/api_function_setgithubactionsstate')] [OutputType([Void])] Param ( [Parameter(Mandatory = $True, Position = 0, ValueFromPipelineByPropertyName = $True)][ValidatePattern('^(?:[\da-z][\da-z_-]*)?[\da-z]$', ErrorMessage = '`{0}` is not a valid GitHub Actions state name!')][Alias('Key')][String]$Name, [Parameter(Mandatory = $True, Position = 1, ValueFromPipelineByPropertyName = $True)][AllowEmptyString()][AllowNull()][String]$Value, [Parameter(ValueFromPipelineByPropertyName = $True)][Switch]$Optimize ) Process { Write-GitHubActionsFileCommand -FileCommand 'GITHUB_STATE' -Name $Name -Value $Value -Optimize:($Optimize.IsPresent) } } Set-Alias -Name 'Save-State' -Value 'Set-State' -Option 'ReadOnly' -Scope 'Local' Export-ModuleMember -Function @( 'Clear-Output', 'Clear-State', 'Get-Input', 'Get-State', 'Set-Output', 'Set-State' ) -Alias @( 'Remove-Output', 'Remove-State', 'Restore-State', 'Save-State' ) |