/// <summary> /// Returns the feature variable corresponding to the variableKey passed. It typecasts the value to the corresponding value type found in settings_file /// </summary> /// <param name="campaignKey">Campaign key to uniquely identify a server-side campaign.</param> /// <param name="variableKey">Campaign key to uniquely identify a server-side campaign.</param> /// <param name="userId">User ID which uniquely identifies each user.</param> /// <param name="options">Dictionary for passing extra parameters to activate</param> /// <returns> /// The name of the variation in which the user is bucketed, or null if the user doesn't qualify to become a part of the campaign. /// </returns> public dynamic GetFeatureVariableValue(string campaignKey, string variableKey, string userId, Dictionary <string, dynamic> options = null) { if (options == null) { options = new Dictionary <string, dynamic>(); } Dictionary <string, dynamic> customVariables = options.ContainsKey("customVariables") ? options["customVariables"] : null; Dictionary <string, dynamic> variationTargetingVariables = options.ContainsKey("variationTargetingVariables") ? options["variationTargetingVariables"] : null; var variables = new List <Dictionary <string, dynamic> >(); var variable = new Dictionary <string, dynamic>(); if (this._validator.GetFeatureVariableValue(campaignKey, variableKey, userId, options)) { var campaign = this._campaignAllocator.GetCampaign(this._settings, campaignKey); if (campaign == null || campaign.Status != Constants.CampaignStatus.RUNNING) { LogErrorMessage.CampaignNotRunning(typeof(IVWOClient).FullName, campaignKey, nameof(GetFeatureVariableValue)); return(null); } if (campaign.Type == Constants.CampaignTypes.VISUAL_AB) { LogErrorMessage.InvalidApi(typeof(IVWOClient).FullName, userId, campaignKey, campaign.Type, nameof(GetFeatureVariableValue)); return(null); } var assignedVariation = this.AllocateVariation(campaignKey, userId, campaign, customVariables, variationTargetingVariables, apiName: nameof(GetFeatureVariableValue)); if (campaign.Type == Constants.CampaignTypes.FEATURE_ROLLOUT) { variables = campaign.Variables; } else if (campaign.Type == Constants.CampaignTypes.FEATURE_TEST) { if (!assignedVariation.Variation.IsFeatureEnabled) { LogInfoMessage.FeatureNotEnabledForUser(typeof(IVWOClient).FullName, campaignKey, userId, nameof(GetFeatureVariableValue)); assignedVariation = this.GetControlVariation(campaign, campaign.Variations.Find(1, (new VariationAllocator()).GetVariationId)); } else { LogInfoMessage.FeatureEnabledForUser(typeof(IVWOClient).FullName, campaignKey, userId, nameof(GetFeatureVariableValue)); } variables = assignedVariation.Variation.Variables; } variable = this.GetVariable(variables, variableKey); if (variable == null || variable.Count == 0) { LogErrorMessage.VariableNotFound(typeof(IVWOClient).FullName, variableKey, campaignKey, campaign.Type, userId, nameof(GetFeatureVariableValue)); return(null); } else { LogInfoMessage.VariableFound(typeof(IVWOClient).FullName, variableKey, campaignKey, campaign.Type, variable["value"].ToString(), userId, nameof(GetFeatureVariableValue)); } return(this._segmentEvaluator.getTypeCastedFeatureValue(variable["value"], variable["type"])); } return(null); }