Class/TechnologyVersion.psm1

using module .\Technology.psm1

<#
.SYNOPSIS
    This class describes a TechnologyVersion
 
.DESCRIPTION
    The TechnologyVersion class describes a TechnologyVersion, the definition of the specific version of the application or portion of an application that
    the Stig applies to. The TechnologyVersion is one of a few Technology focused classes that work together to form a complete
    description of the Stig required by the user or application creating the StigData instance.
 
.EXAMPLE
    $technologyVersion = [TechnologyVersion]::new([string] $Name, [Technology] $Technology)
 
.NOTES
    This class requires PowerShell v5 or above.
#>


Class TechnologyVersion 
{
    #region Properties
    <#
    .DESCRIPTION
        The name of a version of technology of the Stig to select
    #>

    [string] $Name

    <#
    .DESCRIPTION
        The Technology instance for the selected version
    #>

    [Technology] $Technology

    <#
    .DESCRIPTION
        The available versions for each technology currently in PowerStig
    #>

    static $ValidateSet = @"
Windows = All, 2012R2
SQL = Server2012
"@

    #endregion Properties

    #region Constructors
    <#
    .SYNOPSIS
        Parameterless constructor
 
    .DESCRIPTION
        A parameterless constructor for TechnologyVersion. To be used only for
        build/unit testing purposes as Pester currently requires it in order to test
        static methods on powershell classes
 
    .RETURN
        TechnologyVersion
    #>

    TechnologyVersion() 
    {
        Write-Warning "This constructor is for build testing only."
    }

    <#
    .SYNOPSIS
        Constructor
 
    .DESCRIPTION
        A constructor for TechnologyVersion. Returns a ready to use instance
        of TechnologyVersion.
 
    .PARAMETER Name
        The Technology for the selected version
 
    .PARAMETER Technology
        The Technology instance for the selected version
 
    .RETURN
        TechnologyVersion
    #>

    TechnologyVersion ([string] $Name, [Technology] $Technology) 
    {
        $this.Name = $Name
        $Technology.Validate()
        $this.Technology = $Technology
        if (!($this.Validate())) 
        {
            throw("The specified Version name is not valid. Please check for available Versions.")
        }
    }
    #endregion Constructors

    #region Methods
    <#
    .SYNOPSIS
        Validates the provided name
 
    .DESCRIPTION
        This method validates that the provided name for the TechnologyVersion is
        available for a given Technology in PowerStig
 
    .RETURN
        bool
    #>

    [bool] Validate () 
    {
        $versions = [TechnologyVersion]::Available($this.Technology.Name)

        if ($versions -contains $this.Name) 
        {
            return $true
        }
        else 
        {
            Write-Warning -Message "The Versions currently available within PowerStig for $($this.Technology.Name) include:`n$($versions -join "`n")"
            return $false
        }
    }
    #endregion Methods

    #region Static Methods
    <#
    .SYNOPSIS
        Returns available TechnologyVersions
 
    .DESCRIPTION
        This method returns TechnologyVersions for a given Technology name currently available in PowerStig
 
    .PARAMETER TechnologyVersion
        The Technology name
 
    .RETURN
        string[]
    #>

    static [string[]] Available ([string] $Technology) 
    {
        $versions = ConvertFrom-StringData -StringData $([TechnologyVersion]::ValidateSet)

        if ($versions.$Technology) 
        {
            return $versions.$Technology.Split(',').Trim()
        }
        else 
        {
            throw("No Versions are available for the Technology you have specified. Please check available Technologies and run again.")
        }
    }
    #endregion Static Methods
}