Test/helper/module.helper.ps1

# Helper for module variables

function Find-ModuleRootPath{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory,ValueFromPipeline,Position = 0)]
        [string]$Path
    )

    $path = Convert-Path -Path $Path

    while (-not [string]::IsNullOrWhiteSpace($Path)){
        $psd1 = Get-ChildItem -Path $Path -Filter *.psd1 | Select-Object -First 1

        if ($psd1 | Test-Path) {

            if($psd1.BaseName -eq "Test"){
                #foudn testing module. Continue
                $path = $path | Split-Path -Parent
                continue
            }

            # foudn module
            return $path
        }
        # folder without psd1 file
        $path = $path | Split-Path -Parent
    }

    # Path is null. Reached driver root. Module not found
    return $null
}

$MODULE_ROOT_PATH = $PSScriptRoot | Find-ModuleRootPath
$MODULE_NAME = (Get-ChildItem -Path $MODULE_ROOT_PATH -Filter *.psd1 | Select-Object -First 1).BaseName

# Helper for module variables


$VALID_FOLDER_NAMES = @('Include', 'Private', 'Public', 'Root', 'TestInclude', 'TestPrivate', 'TestPublic', 'TestRoot', 'Tools', 'DevContainer', 'WorkFlows', 'GitHub', 'Helper', 'Config', 'TestHelper', 'TestConfig')

class ValidFolderNames : System.Management.Automation.IValidateSetValuesGenerator {
    [String[]] GetValidValues() {
      return $script:VALID_FOLDER_NAMES
    }
}

function Get-Ps1FullPath{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory,Position = 0)][string]$Name,
        [Parameter(Position = 1)][ValidateSet([ValidFolderNames])][string]$FolderName,
        [Parameter(Position = 0)][string]$ModuleRootPath
    )

   # If folderName is not empty
    if($null -ne $FolderName){
        $folder = Get-ModuleFolder -FolderName $FolderName -ModuleRootPath $ModuleRootPath
        $path = $folder | Join-Path -ChildPath $Name
    } else {
        $path = $Name
    }

    # Check if file exists
    if(-Not (Test-Path $path)){
        throw "File $path not found"
    }

    # Get Path item
    $item = Get-item -Path $path

    return $item
}
function Get-ModuleRootPath{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)][string]$ModuleRootPath
    )

    # if ModuleRootPath is not provided, default to local module path
    if([string]::IsNullOrWhiteSpace($ModuleRootPath)){
        $ModuleRootPath = $MODULE_ROOT_PATH
    }

    # Convert to full path
    $ModuleRootPath = Convert-Path -Path $ModuleRootPath

    return $ModuleRootPath
}

function Get-ModuleName{
    [CmdletBinding()]
    param(
        [Parameter(Position = 0)] [string]$ModuleRootPath
    )

    $ModuleRootPath = Get-ModuleRootPath -ModuleRootPath $ModuleRootPath

    $MODULE_NAME = (Get-ChildItem -Path $MODULE_ROOT_PATH -Filter *.psd1 | Select-Object -First 1).BaseName


    return $MODULE_NAME
}

<#
.SYNOPSIS
Gets the full path of a specific module folder.

.DESCRIPTION
Gets the full path of a specific module folder based on the folder name and optionally the module root path.

.PARAMETER FolderName
The name of the folder to get the path for. Must be one of the valid folder names.

.PARAMETER ModuleRootPath
The root path of the module. If not provided, uses the default module root path.

.EXAMPLE
Get-ModuleFolder -FolderName "Public"
Gets the path to the Public folder of the current module.

.EXAMPLE
Get-ModuleFolder -FolderName "Private" -ModuleRootPath "C:\MyModule"
Gets the path to the Private folder of the specified module.
#>

function Get-ModuleFolder{
    [CmdletBinding()]
    param(
        [Parameter(Mandatory,Position = 0)][ValidateSet([ValidFolderNames])][string]$FolderName,
        [Parameter(Position = 1)][string]$ModuleRootPath
    )

    $ModuleRootPath = Get-ModuleRootPath -ModuleRootPath $ModuleRootPath

    # TestRootPath
    $testRootPath = $ModuleRootPath | Join-Path -ChildPath "Test"

    switch ($FolderName){
        'Public'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "public"
        }
        'Private'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "private"
        }
        'Include'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "include"
        }
        'TestInclude'{
            $moduleFolder = $testRootPath | Join-Path -ChildPath "include"
        }
        'TestPrivate'{
            $moduleFolder = $testRootPath | Join-Path -ChildPath "private"
        }
        'TestPublic'{
            $moduleFolder = $testRootPath | Join-Path -ChildPath "public"
        }
        'Root'{
            $moduleFolder = $ModuleRootPath
        }
        'TestRoot'{
            $moduleFolder = $testRootPath
        }
        'Tools'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "tools"
        }
        'DevContainer'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath ".devcontainer"
        }
        'WorkFlows'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath ".github/workflows"
        }
        'GitHub'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath ".github"
        }
        'Helper'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "helper"
        }
        'Config'{
            $moduleFolder = $ModuleRootPath | Join-Path -ChildPath "config"
        }
        'TestHelper'{
            $moduleFolder = $testRootPath | Join-Path -ChildPath "helper"
        }
        'TestConfig'{
            $moduleFolder = $testRootPath | Join-Path -ChildPath "config"
        }
        default{
            throw "Folder [$FolderName] is unknown"
        }
    }
    return $moduleFolder
} Export-ModuleMember -Function Get-ModuleFolder