Lib/helper.psm1
<#
.SYNOPSIS Git Helper .DESCRIPTION Git Helper .NOTES Author : hillesheim@n-dimensions.de Version : 2.5 DateLastChanged : 2023-09-16 #> Write-Host "Load nested module 'helper' ... "; # ************************************************************************************************ # ************************************************************************************************ #region DECLARATION # ************************************************************************************************ #region TYPES #endregion # ************************************************************************************************ #region USER_VARIABLES #endregion # ************************************************************************************************ #region SYSTEM_VARIABLES #endregion #endregion # ************************************************************************************************ # ************************************************************************************************ #region FUNCTIONS_PUBLIC # ************************************************************************************************ # Function Show-ListSelection { Param( [String[]] $List, [Int[]] $Default = @(), [String] $Title = "PLEASE SELECT" ) Clear-Host; $rtrVal = @(); [Int[]] $selectedNumbers0 = @(); $PresentUi = { Param( [String[]] $List, [Int[]] $Default = @() ) [Int[]] $selectedNumbers1 = @(); # Compute ui [String] $ui = "`n<header_line> `n<title> `n<header_line> `n`n<list_of_choices> <explanation>"; [String] $headerLine = "*" * 70; [String] $listOfChoices = ""; [Int] $listLength = $List.Length; # [Int] $enumLength = [System.Enum]::GetValues($Enum).Length; For ( $i = 0; $i -lt $listLength; $i++ ){ $listOfChoices += "[{0}] {1}" -f ($i + 1).ToString(), $List[$i] + "`n"; } [String] $explanation = ""; $explanation += "`n- Input a single number "; $explanation += "or `n- Input a list of numbers separated by ',' "; If($Default.Length -gt 0){ $explanation += "or `n- Press ENTER for default ({0})" -f ($Default -join ","); } $ui = $ui.Replace("<header_line>", $headerLine); $ui = $ui.Replace("<title>", $Title); $ui = $ui.Replace("<list_of_choices>", $listOfChoices); $ui = $ui.Replace("<explanation>", $explanation); $userChoice = Read-Host -Prompt $ui; # If null, apply default, else user input If ( ($userChoice -eq "") -and ($Default.Length -gt 0) ){ $selectedNumbers1 = $Default; } # If invalid, apply 0 If ( ($userChoice -eq "") -and ($Default.Length -eq 0) ){ $selectedNumbers1 = @(0); } # Check input; try parse Try { If ( $userChoice.Length -gt 0){ [String[]] $stringParts = $userChoice.Split(","); } ForEach ($item in $stringParts) { $item = $item.Trim(); [Int] $number = -1; # Check type [Boolean] $success = [Int]::TryParse($item, [ref] $number); If (-not $success){ $number = 0; } # Check range If(-not ($number -ge 1 -and $number -le $listLength )) { $number = 0; } # Check duplicate If(-not ($selectedNumbers1 -contains $number )){ $selectedNumbers1 += $number; } } } Catch {} # Return Write-Output $selectedNumbers1; } # Run [Int[]] $selectedNumbers0 = $PresentUi.Invoke(@($List,$Default)); # Re-run If($selectedNumbers0 -contains 0){ $rerun = Read-Host ( "Your selection contained 0. Re-run (y|n). Press ENTER for 'n'?") If($rerun -eq "" -or $null -eq $rerun -or $rerun.ToLower() -eq "y"){ [Int[]] $selectedNumbers0 = $PresentUi.Invoke(@($List,$Default)); } } $selectedNumbers0 ` | ForEach-Object { $selection = $List[$_ - 1]; $rtrVal += $selection; } Write-Output $rtrVal; } # ************************************************************************************************ # Enter selection Function Show-EnumSelection { Param( $Enum, [Int[]] $Default = @(), [String] $Title = "PLEASE SELECT" ) $rtrVal = @(); [Int[]] $selectedNumbers0 = @(); $PresentUi = { Param( $Enum, [Int[]] $Default = @() ) [Int[]] $selectedNumbers1 = @(); # Compute ui [String] $ui = "`n<header_line> `n<title> `n<header_line> `n`n<list_of_choices> <explanation>"; [String] $headerLine = "*" * 70; # [String] $prompt = "PLEASE SELECT"; [String] $listOfChoices = ""; [Int] $enumLength = [System.Enum]::GetValues($Enum).Length; For ( $i = 1; $i -lt $enumLength; $i++ ){ $listOfChoices += "[{0}] {1}" -f $i.ToString(), $Enum.GetEnumName($i) + "`n"; } [String] $explanation = ""; $explanation += "`n- Input a single number "; $explanation += "or `n- Input a list of numbers separated by ',' "; If($Default.Length -gt 0){ $explanation += "or `n- Press ENTER for default ({0})" -f ($Default -join ","); } $ui = $ui.Replace("<header_line>", $headerLine); $ui = $ui.Replace("<title>", $Title); $ui = $ui.Replace("<list_of_choices>", $listOfChoices); $ui = $ui.Replace("<explanation>", $explanation); $userChoice = Read-Host -Prompt $ui; # If null, apply default If ( ($userChoice -eq "") -and ($Default.Length -gt 0) ){ $selectedNumbers1 = $Default; } # If invalid, apply 0 If ( ($userChoice -eq "") -and ($Default.Length -eq 0) ){ $selectedNumbers1 = @(0); } # Check input; try parse Try { If ( $userChoice.Length -gt 0){ [String[]] $stringParts = $userChoice.Split(","); } ForEach ($item in $stringParts) { $item = $item.Trim(); [Int] $number = -1; # Check type [Boolean] $success = [Int]::TryParse($item, [ref] $number); If (-not $success){ $number = 0; } # Check range If(-not ($number -ge 1 -and $number -lt $enumLength )) { $number = 0; } # Check duplicate If(-not ($selectedNumbers1 -contains $number )){ $selectedNumbers1 += $number; } } } Catch {} # Return Write-Output $selectedNumbers1; } # Run [Int[]] $selectedNumbers0 = $PresentUi.Invoke(@($Enum,$Default)); # Re-run If($selectedNumbers0 -contains 0){ $rerun = Read-Host ( "Your selection contained {0}. Re-run (y|n). Press ENTER for 'n'?" -f [Enum]::ToObject($Enum, 0)) If($rerun -eq "" -or $null -eq $rerun -or $rerun.ToLower() -eq "y"){ [Int[]] $selectedNumbers0 = $PresentUi.Invoke(@($Enum,$Default)); } } $selectedNumbers0 ` | ForEach-Object { $selection = [Enum]::ToObject($Enum, $_); $rtrVal += $Enum::$selection; } Write-Output $rtrVal; } # ************************************************************************************************ # Get artifact feed url Function Get-ArtifactFeedUrl { Param( [NugetPackage] $NugetPackage, [ArtifactSettings] $ArtifactSettings ) [String] $rtrVal = $null; [String] $feedUrl = $null; # Write-Host ("Compute artifact feed url for '{0}' ... " -f $NugetPackage.Name); # "https://pkgs.dev.azure.com/n-dimensions-dev/NAF/_packaging/NdimensionsAutomationModules/nuget/v3/index.json" [String] $templateFeedUrl = "<DEVOPS_URL>/<ORGANIZATION>/<PROJECT>/_packaging/<FEED>/nuget/v3/index.json"; $feedUrl = $templateFeedUrl.Replace("<DEVOPS_URL>", $ArtifactSettings.DevopsUrl); $feedUrl = $feedUrl.Replace("<ORGANIZATION>", $ArtifactSettings.OrganizationName); $feedUrl = $feedUrl.Replace("<PROJECT>", $ArtifactSettings.ProjectName); $feedUrl = $feedUrl.Replace("<FEED>", $NugetPackage.ArtifactFeedId); # Return $rtrVal = $feedUrl; Write-Output $rtrVal; } # ************************************************************************************************ # Open script editor Function Open-ScriptEditor { Param( [String] $Filepath ) [String] $fileName = (Get-Item -Path $Filepath).Name; Write-Host ("Edit script '{0}' ... " -f $fileName); notepad "$Filepath"; } #endregion #region EXPORT # Export-ModuleMember -Function 'Get-PathFromPattern'; Export-ModuleMember -Function 'Show-EnumSelection'; Export-ModuleMember -Function 'Show-ListSelection'; Export-ModuleMember -Function 'Get-ArtifactFeedUrl'; #endregion |