in src/PSRule/Pipeline/InvokeRulePipeline.cs [238:327]
private InvokeResult ProcessTargetObject(TargetObject targetObject)
{
try
{
Context.EnterTargetObject(targetObject);
var result = new InvokeResult();
var ruleCounter = 0;
var suppressedRuleCounter = 0;
var suppressionGroupCounter = new Dictionary<string, int>();
// Process rule blocks ordered by dependency graph
foreach (var ruleBlockTarget in _RuleGraph.GetSingleTarget())
{
// Enter rule block scope
var ruleRecord = Context.EnterRuleBlock(ruleBlock: ruleBlockTarget.Value);
ruleCounter++;
try
{
if (Context.Binding.ShouldFilter)
continue;
// Check if dependency failed
if (ruleBlockTarget.Skipped)
{
ruleRecord.OutcomeReason = RuleOutcomeReason.DependencyFail;
}
// Check for suppression
else if (_SuppressionFilter.Match(id: ruleBlockTarget.Value.Id, targetName: ruleRecord.TargetName))
{
ruleRecord.OutcomeReason = RuleOutcomeReason.Suppressed;
suppressedRuleCounter++;
if (_ResultFormat == ResultFormat.Detail)
Context.WarnRuleSuppressed(ruleId: ruleRecord.RuleId);
}
// Check for suppression group
else if (_SuppressionGroupFilter.TrySuppressionGroup(ruleId: ruleRecord.RuleId, targetObject, out var suppressionGroupId))
{
ruleRecord.OutcomeReason = RuleOutcomeReason.Suppressed;
if (_ResultFormat == ResultFormat.Detail)
Context.WarnRuleSuppressionGroup(ruleId: ruleRecord.RuleId, suppressionGroupId);
else if (_ResultFormat == ResultFormat.Summary)
suppressionGroupCounter[suppressionGroupId] = suppressionGroupCounter.TryGetValue(suppressionGroupId, out var count) ? ++count : 1;
}
else
{
HostHelper.InvokeRuleBlock(context: Context, ruleBlock: ruleBlockTarget.Value, ruleRecord: ruleRecord);
if (ruleRecord.OutcomeReason == RuleOutcomeReason.PreconditionFail)
ruleCounter--;
}
// Report outcome to dependency graph
if (ruleRecord.Outcome == RuleOutcome.Pass)
ruleBlockTarget.Pass();
else if (ruleRecord.Outcome == RuleOutcome.Fail || ruleRecord.Outcome == RuleOutcome.Error)
ruleBlockTarget.Fail();
AddToSummary(ruleBlock: ruleBlockTarget.Value, outcome: ruleRecord.Outcome);
if (ShouldOutput(ruleRecord.Outcome))
result.Add(ruleRecord);
}
finally
{
// Exit rule block scope
Context.ExitRuleBlock();
}
}
if (ruleCounter == 0)
Context.WarnObjectNotProcessed();
if (_ResultFormat == ResultFormat.Summary)
{
if (suppressedRuleCounter > 0)
Context.WarnRuleCountSuppressed(ruleCount: suppressedRuleCounter);
foreach (var keyValuePair in suppressionGroupCounter)
Context.WarnRuleSuppressionGroupCount(ruleCount: keyValuePair.Value, suppressionGroupId: keyValuePair.Key);
}
return result;
}
finally
{
Context.ExitTargetObject();
}
}