using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using CTA.FeatureDetection.Common.Models.Configuration; using CTA.FeatureDetection.Common.Models.Enums; using CTA.FeatureDetection.Common.Models.Features.Base; using CTA.FeatureDetection.Common.Models.Features.Conditions.Base; [assembly: InternalsVisibleTo("CTA.FeatureDetection.Tests")] namespace CTA.FeatureDetection.Load.Factories { internal class ConfiguredFeatureFactory { /// /// Factory method that dynamically instantiates a configured feature using condition metadata /// /// The scope in which to look for this feature /// Name of the feature /// Metadata defining the feature condition /// Instance of the defined feature public static ConfiguredFeature GetInstance(FeatureScope featureScope, string name, ConditionMetadata conditionMetadata) { var condition = ConditionFactory.GetCondition(conditionMetadata); return new ConfiguredFeature(featureScope, name, condition); } /// /// Factory method that dynamically instantiates a configured feature using condition group metadata /// /// The scope in which to look for this feature /// Name of the feature /// Metadata defining the feature condition group /// Instance of the defined feature public static ConfiguredFeature GetInstance(FeatureScope featureScope, string name, ConditionGroupMetadata conditionGroupMetadata) { var conditionGroup = new ConditionGroup { JoinOperator = conditionGroupMetadata.JoinOperator, Conditions = ConditionFactory.GetConditions(conditionGroupMetadata.Conditions) }; return new ConfiguredFeature(featureScope, name, conditionGroup); } /// /// Factory method that dynamically instantiates a configured feature using a collection of condition group metadata /// /// The scope in which to look for this feature /// Name of the feature /// Metadata defining the feature condition groups /// Instance of the defined feature public static ConfiguredFeature GetInstance(FeatureScope featureScope, string name, IEnumerable conditionGroupsMetadata) { var conditionGroups = conditionGroupsMetadata.Select(conditionGroupMetadata => new ConditionGroup { JoinOperator = conditionGroupMetadata.JoinOperator, Conditions = ConditionFactory.GetConditions(conditionGroupMetadata.Conditions) } ); return new ConfiguredFeature(featureScope, name, conditionGroups); } } }