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);
}
}
}