PSSemVer.psm1

[Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidLongLines', '', Justification = 'Contains long links.')]
[CmdletBinding()]
param()

$scriptName = $MyInvocation.MyCommand.Name
Write-Verbose "[$scriptName] Importing module"

#region - Data import
Write-Verbose "[$scriptName] - [data] - Processing folder"
$dataFolder = (Join-Path $PSScriptRoot 'data')
Write-Verbose "[$scriptName] - [data] - [$dataFolder]"
Get-ChildItem -Path "$dataFolder" -Recurse -Force -Include '*.psd1' -ErrorAction SilentlyContinue | ForEach-Object {
    Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Importing"
    New-Variable -Name $_.BaseName -Value (Import-PowerShellDataFile -Path $_.FullName) -Force
    Write-Verbose "[$scriptName] - [data] - [$($_.Name)] - Done"
}

Write-Verbose "[$scriptName] - [data] - Done"
#endregion - Data import

#region - From /public
Write-Verbose "[$scriptName] - [/public] - Processing folder"

#region - From /public/ConvertTo-PSSemVer.ps1
Write-Verbose "[$scriptName] - [/public/ConvertTo-PSSemVer.ps1] - Importing"

filter ConvertTo-PSSemVer {
    <#
        .SYNOPSIS
        Converts a version string to a PSSemVer object.

        .DESCRIPTION
        This function takes a version string and converts it to a PSSemVer object.

        .EXAMPLE
        '1.2.3-alpha.1+001' | ConvertTo-SemVer

        Major : 1
        Minor : 2
        Patch : 3
        Prerelease : alpha.1
        BuildMetadata : 001

        .NOTES
        Compatible with [PSSemVer 2.0.0](https://PSSemVer.org/).
    #>

    [OutputType([PSSemVer])]
    [CmdletBinding()]
    param (
        # The version to convert.
        [Parameter(
            Mandatory,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName)
        ]
        [AllowNull()]
        [AllowEmptyString()]
        [string] $Version
    )

    if ($Version | IsNullOrEmpty) {
        return New-PSSemVer
    }

    try {
        $PSSemVer = [PSSemVer]::new($Version)
        return $PSSemVer
    } catch {
        throw "Failed to convert '$Version' to PSSemVer."
    }
}

Write-Verbose "[$scriptName] - [/public/ConvertTo-PSSemVer.ps1] - Done"
#endregion - From /public/ConvertTo-PSSemVer.ps1
#region - From /public/New-PSSemVer.ps1
Write-Verbose "[$scriptName] - [/public/New-PSSemVer.ps1] - Importing"

function New-PSSemVer {
    <#
        .SYNOPSIS
        Creates a new PSSemVer object.

        .DESCRIPTION
        This function creates a new PSSemVer object.

        .EXAMPLE
        New-SemVer -Version '1.2.3-alpha.1+001'

        Major : 1
        Minor : 2
        Patch : 3
        Prerelease : alpha.1
        BuildMetadata : 001

        .EXAMPLE
        New-SemVer -Major 1 -Minor 2 -Patch 3 -Prerelease 'alpha.1' -BuildMetadata '001'

        Major : 1
        Minor : 2
        Patch : 3
        Prerelease : alpha.1
        BuildMetadata : 001

        .NOTES
        Compatible with [PSSemVer 2.0.0](https://PSSemVer.org/).
    #>

    [Diagnostics.CodeAnalysis.SuppressMessageAttribute(
        'PSUseShouldProcessForStateChangingFunctions', '',
        Justification = 'Does not change system state, but creates a new object.'
    )]
    [OutputType([PSSemVer])]
    [CmdletBinding(DefaultParameterSetName = 'String')]
    param (
        # The major version.
        [Parameter(ParameterSetName = 'Values')]
        [int] $Major = 0,

        # The minor version.
        [Parameter(ParameterSetName = 'Values')]
        [int] $Minor = 0,

        # The patch version.
        [Parameter(ParameterSetName = 'Values')]
        [int] $Patch = 0,

        # The prerelease version.
        [Parameter(ParameterSetName = 'Values')]
        [Alias('PreReleaseLabel')]
        [string] $Prerelease = '',

        # The build metadata.
        [Parameter(ParameterSetName = 'Values')]
        [Alias('Build', 'BuildLabel')]
        [string] $BuildMetadata = '',

        # The version as a string.
        [Parameter(ParameterSetName = 'String')]
        [string] $Version = ''
    )

    switch ($PSCmdlet.ParameterSetName) {
        'String' {
            return [PSSemVer]::New($Version)
        }
        'Values' {
            return [PSSemVer]::New($Major, $Minor, $Patch, $Prerelease, $BuildMetadata)
        }
    }
}

Write-Verbose "[$scriptName] - [/public/New-PSSemVer.ps1] - Done"
#endregion - From /public/New-PSSemVer.ps1

Write-Verbose "[$scriptName] - [/public] - Done"
#endregion - From /public

$exports = @{
    Alias    = '*'
    Variable = ''
    Function = @(
        'ConvertTo-PSSemVer'
        'New-PSSemVer'
    )
    Cmdlet   = ''
}
Export-ModuleMember @exports