Catesta.psm1

# This is a locally sourced Imports file for local development.
# It can be imported by the psm1 in local development to add script level variables.
# It will merged in the build process. This is for local development only.

# region script variables
$script:resourcePath = "$PSScriptRoot\Resources"


<#
.EXTERNALHELP Catesta-help.xml
#>

function New-PowerShellProject {
    [CmdletBinding(ConfirmImpact = 'Low',
        SupportsShouldProcess = $true)]
    param (
        [Parameter(Mandatory = $true,
            HelpMessage = 'CICD Platform Choice')]
        [ValidateSet('AWS', 'GitHubActions', 'Azure', 'AppVeyor','ModuleOnly')]
        [string]
        $CICDChoice,
        [Parameter(Mandatory = $true,
            HelpMessage = 'File path where PowerShell Module project will be created')]
        [string]
        $DestinationPath,
        [Parameter(Mandatory = $false,
            HelpMessage = 'Skip confirmation')]
        [switch]$Force
    )
    Begin {

        if (-not $PSBoundParameters.ContainsKey('Verbose')) {
            $VerbosePreference = $PSCmdlet.SessionState.PSVariable.GetValue('VerbosePreference')
        }
        if (-not $PSBoundParameters.ContainsKey('Confirm')) {
            $ConfirmPreference = $PSCmdlet.SessionState.PSVariable.GetValue('ConfirmPreference')
        }
        if (-not $PSBoundParameters.ContainsKey('WhatIf')) {
            $WhatIfPreference = $PSCmdlet.SessionState.PSVariable.GetValue('WhatIfPreference')
        }

        Write-Verbose -Message ('[{0}] Confirm={1} ConfirmPreference={2} WhatIf={3} WhatIfPreference={4}' -f $MyInvocation.MyCommand, $Confirm, $ConfirmPreference, $WhatIf, $WhatIfPreference)

    }#begin
    Process {
        # -Confirm --> $ConfirmPreference = 'Low'
        # ShouldProcess intercepts WhatIf* --> no need to pass it on
        if ($Force -or $PSCmdlet.ShouldProcess("ShouldProcess?")) {
            Write-Verbose -Message ('[{0}] Reached command' -f $MyInvocation.MyCommand)
            $ConfirmPreference = 'None'

            Write-Verbose -Message 'Importing Plaster...'
            try {
                Import-Module -Name Plaster -ErrorAction Stop
                Write-Verbose 'Plaster Imported.'
            }
            catch {
                throw $_
            }

            Write-Verbose -Message 'Sourcing correct template...'
            switch ($CICDChoice) {
                'AWS' {
                    Write-Verbose -Message 'AWS Template Selected.'
                    $path = '\AWS'
                }#aws
                'GitHubActions' {
                    Write-Verbose -Message 'GitHub Actions Template Selected.'
                    $path = '\GitHubActions'
                }#githubactions
                'Azure' {
                    Write-Verbose -Message 'Azure Pipelines Template Selected.'
                    $path = '\Azure'
                }#githubactions
                'AppVeyor' {
                    Write-Verbose -Message 'AppVeyor Template Selected.'
                    $path = '\AppVeyor'
                }#appveyor
                'ModuleOnly' {
                    Write-Verbose -Message 'Module Only Template Selected.'
                    $path = '\Vanilla'
                }#moduleonly
            }#switch

            Write-Verbose -Message 'Deploying template...'
            try {
                $results = Invoke-Plaster -TemplatePath "$script:resourcePath\$path" -DestinationPath $DestinationPath -PassThru -ErrorAction Stop
                Write-Verbose -Message 'Template Deployed.'
            }
            catch {
                Write-Error $_
                $results = [PSCustomObject]@{
                    Success = $false
                }
            }

        }#if_Should
    }#process
    End {
        return $results
    }#end
}#New-PowerShellProject