microsoft / PSRule

Validate infrastructure as code (IaC) and objects using PowerShell rules.
https://microsoft.github.io/PSRule/v2/
MIT License
395 stars 49 forks source link

The Rule keyword inside a Rule throw a System.NullReferenceException #189

Closed LaurentDardenne closed 5 years ago

LaurentDardenne commented 5 years ago
$Path='C:\temp'
$File='Test.Rule.ps1'
@'
Rule Main {
    Rule nested {
        $True
    }
    $True
}
'@ >"$Path\$File"

cd $path
'object'|Invoke-psrule -path "$path\$File"
# Rule : La référence d'objet n'est pas définie à une instance d'un objet.
# Au caractère C:\temp\Test.Rule.ps1:2 : 5
# +     Rule nested {
# +     ~~~~~~~~~~~~~
#     + CategoryInfo          : NotSpecified: (:) [New-RuleDefinition], NullReferenceException
#     + FullyQualifiedErrorId : System.NullReferenceException,PSRule.Commands.NewRuleDefinitionCommand

$e=$error[0]
$e|select *

# PSMessageDetails      :
# Exception             : System.NullReferenceException: La référence d'objet n'est pas définie à une instance d'un
#                         objet.
#                            à PSRule.Commands.NewRuleDefinitionCommand.ProcessRecord()
#                            à System.Management.Automation.CommandProcessor.ProcessRecord()
# TargetObject          :
# CategoryInfo          : NotSpecified: (:) [New-RuleDefinition], NullReferenceException
# FullyQualifiedErrorId : System.NullReferenceException,PSRule.Commands.NewRuleDefinitionCommand
# ErrorDetails          :
# InvocationInfo        : System.Management.Automation.InvocationInfo
# ScriptStackTrace      : à <ScriptBlock>, C:\temp\Test.Rule.ps1 : ligne 2
# PipelineIterationInfo : {}

$e.exception|select *

# Message        : La référence d'objet n'est pas définie à une instance d'un objet.
# Data           : {}
# InnerException :
# TargetSite     : Void ProcessRecord()
# StackTrace     :    à PSRule.Commands.NewRuleDefinitionCommand.ProcessRecord()
#                     à System.Management.Automation.CommandProcessor.ProcessRecord()
# HelpLink       :
# Source         : PSRule
# HResult        : -2147467261

Expected behaviour This possibility does not seem to me allowed, but into the documentation it says (paragraph body)

Body - A script block definition of the rule containing one or more PSRule keywords and PowerShell expressions.

Is it implicitly "...containing one or more PSRule keywords except the 'Rule' keyword" ?

BernieWhite commented 5 years ago

@LaurentDardenne Agree. The documentation should be updated and possibly checks can be added to provide a better message.

Rule keywords can't be nested.