private static bool VisitConditionNode(IConditionNode <TConditionType> conditionNode, IDictionary <TConditionType, bool> conditionsChecklist) { switch (conditionNode) { case IValueConditionNode <TConditionType> valueConditionNode: if (conditionsChecklist.ContainsKey(valueConditionNode.ConditionType)) { conditionsChecklist[valueConditionNode.ConditionType] = true; } return(conditionsChecklist.All(kvp => kvp.Value)); case ComposedConditionNode <TConditionType> composedConditionNode: foreach (IConditionNode <TConditionType> childConditionNode in composedConditionNode.ChildConditionNodes) { bool allPresentAlready = VisitConditionNode(childConditionNode, conditionsChecklist); if (allPresentAlready) { return(true); } } return(false); default: throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'."); } }
private ISpecification <IEnumerable <Condition <TConditionType> > > BuildSpecification(IConditionNode <TConditionType> conditionNode, MatchModes matchMode) { return(conditionNode switch { IValueConditionNode <TConditionType> valueConditionNode => this.BuildSpecificationForValueNode(valueConditionNode, matchMode), ComposedConditionNode <TConditionType> composedConditionNode => this.BuildSpecificationForComposedNode(composedConditionNode, matchMode), _ => throw new NotSupportedException($"Unsupported condition node: '{conditionNode.GetType().Name}'."), });