Functions/Invoke-RivetPlugin.ps1


function Invoke-RivetPlugin
{
    param(
        [Parameter(Mandatory)]
        [Rivet.Events]
        $Event,

        [hashtable]
        $Parameter
    )

    Set-StrictMode -Version 'Latest'
    Use-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState

    Write-Timing -Message 'Invoke-RivetPlugin BEGIN' -Indent

    $responders = $plugins |
                        Where-Object {
                            $_.ScriptBlock.Attributes | Where-Object { $_ -is [Rivet.PluginAttribute] -and $_.RespondsTo -eq $Event }
                        }
    try
    {
        if( -not $responders )
        {
            return
        }

        foreach( $plugin in $responders )
        {
            foreach( $parameterName in $Parameter.Keys )
            {
                if( -not $plugin.Parameters.ContainsKey($parameterName) )
                {
                    Write-Error -Message ('The function "{0}" that responds to Rivet''s "{1}" event must have a named "{2}" parameter. Please update this function''s definition.' -f $plugin.Name,$Event,$parameterName) -ErrorAction Stop
                }
            }

            & $plugin.Name @Parameter
            Write-Timing -Message (' {0}' -f $plugin.Name)
        }
    }
    finally
    {
        Write-Timing -Message 'Invoke-RivetPlugin END' -Outdent
    }
}