Requirements/src/interface.ps1

166 lines
4.6 KiB
PowerShell

$ErrorActionPreference = "Stop"
."$PSScriptRoot\core.ps1"
."$PSScriptRoot\formatters.ps1"
<#
.SYNOPSIS
Creates a new Requirement object
.OUTPUTS
The resulting Requirement
.NOTES
Dsc parameter set is unsupported due to cross-platform limitations
#>
function New-Requirement {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")]
[OutputType([Requirement])]
[CmdletBinding()]
Param(
# The unique identifier for the Requirement
[Parameter(ParameterSetName = "Script")]
[Parameter(ParameterSetName = "Dsc")]
[string] $Namespace,
# A description of the Requirement
[Parameter(Mandatory, ParameterSetName = "Script")]
[Parameter(Mandatory, ParameterSetName = "Dsc")]
[string] $Describe,
# The Test condition that determines if the Requirement is in its desired state
[Parameter(ParameterSetName = "Script")]
[scriptblock] $Test,
# The Set condition that Sets the Requirement to its desired state
[Parameter(ParameterSetName = "Script")]
[scriptblock] $Set,
# The list of Requirement Names that must be in desired state prior to this Requirement
[Parameter(ParameterSetName = "Script")]
[Parameter(ParameterSetName = "Dsc")]
[ValidateNotNull()]
[string[]] $DependsOn = @(),
# The name of the DSC resource associated with the Requirement
[Parameter(Mandatory, ParameterSetName = "Dsc")]
[ValidateNotNullOrEmpty()]
[string]$ResourceName,
# The module containing the DSC resource
[Parameter(Mandatory, ParameterSetName = "Dsc")]
[ValidateNotNullOrEmpty()]
[string]$ModuleName,
# The properties passed through to the DSC resource
[Parameter(Mandatory, ParameterSetName = "Dsc")]
[ValidateNotNullOrEmpty()]
[hashtable]$Property
)
switch ($PSCmdlet.ParameterSetName) {
"Script" {
[Requirement]@{
Namespace = $Namespace
Describe = $Describe
Test = $Test
Set = $Set
DependsOn = $DependsOn
}
}
"Dsc" {
$dscParams = @{
Name = $ResourceName
ModuleName = $ModuleName
Property = $Property
}
[Requirement]@{
Namespace = $Namespace
Describe = $Describe
Test = { Invoke-DscResource -Method "Test" @dscParams }.GetNewClosure()
Set = { Invoke-DscResource -Method "Set" @dscParams }.GetNewClosure()
DependsOn = $DependsOn
}
}
}
}
<#
.SYNOPSIS
Sets Requirements to their desired states
.OUTPUTS
The RequirementEvents logged from each stage of the Requirement lifecycle
#>
function Invoke-Requirement {
[CmdletBinding()]
[OutputType([RequirementEvent])]
Param(
# The Requirements to put in their desired state
[Parameter(Mandatory, ValueFromPipeline)]
[Requirement[]] $Requirement
)
applyRequirements (sortRequirements $input)
}
<#
.SYNOPSIS
Tests whether a requirement is in its desired state
#>
function Test-Requirement {
[CmdletBinding()]
Param(
# The Requirement to test its desired state
[Parameter(Mandatory, ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[Requirement[]] $Requirement
)
testRequirements (sortRequirements $input)
}
<#
.SYNOPSIS
Sets the requirement to its desired state
#>
function Set-Requirement {
[CmdletBinding(SupportsShouldProcess)]
Param(
# The Requirement that sets if its in its desired state
[Parameter(Mandatory, ValueFromPipeline)]
[ValidateNotNullOrEmpty()]
[Requirement] $Requirement
)
if ($PSCmdlet.ShouldProcess($Requirement, "Set")) {
&$Requirement.Set
}
}
<#
.SYNOPSIS
Creates a Group of Requirements
#>
function New-RequirementGroup {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")]
[CmdletBinding()]
[Alias("Push-Namespace")]
Param(
# The namespace identifier
[Parameter(Mandatory, Position = 0)]
[Alias("Namespace")]
[ValidateNotNullOrEmpty()]
[string]$Name,
# A scriptblock that writes Requirements to output when invoked
[Parameter(Mandatory, Position = 1, ParameterSetName = "scriptblock")]
[ValidateNotNullOrEmpty()]
[scriptblock]$ScriptBlock,
# The array of Requirements to add under the new Group
[Parameter(Mandatory, Position = 1, ParameterSetName = "requirements")]
[ValidateNotNullOrEmpty()]
[Requirement[]]$Requirement
)
if ($PSCmdlet.ParameterSetName -eq "scriptblock") {
$Requirement = &$ScriptBlock
}
$Requirement `
| % {
$r = $_.psobject.Copy()
$r.Namespace = ($Name, $r.Namespace | ? { $_ }) -join $NamespaceDelimiter
$r
}
}