public JToken JsonVariation(string key, User user, JToken defaultValue) { return(Evaluate(key, user, LdValue.FromSafeValue(defaultValue), LdValue.Convert.UnsafeJToken, false, EventFactory.Default).Value); }
public IUserBuilderCanMakeAttributePrivate Custom(string name, float value) { return(Custom(name, LdValue.Of(value))); }
/// <inheritdoc/> public string StringVariation(string key, User user, string defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.String, true, EventFactory.Default).Value); }
private EvaluationDetail <T> Evaluate <T>(string featureKey, User user, LdValue defaultValue, LdValue.Converter <T> converter, bool checkType, EventFactory eventFactory) { T defaultValueOfType = converter.ToType(defaultValue); if (!Initialized()) { if (_featureStore.Initialized()) { Log.Warn("Flag evaluation before client initialized; using last known values from feature store"); } else { Log.Warn("Flag evaluation before client initialized; feature store unavailable, returning default value"); return(new EvaluationDetail <T>(defaultValueOfType, null, EvaluationReason.ErrorReason(EvaluationErrorKind.CLIENT_NOT_READY))); } } FeatureFlag featureFlag = null; try { featureFlag = _featureStore.Get(VersionedDataKind.Features, featureKey); if (featureFlag == null) { Log.InfoFormat("Unknown feature flag {0}; returning default value", featureKey); _eventProcessor.SendEvent(eventFactory.NewUnknownFeatureRequestEvent(featureKey, user, defaultValue, EvaluationErrorKind.FLAG_NOT_FOUND)); return(new EvaluationDetail <T>(defaultValueOfType, null, EvaluationReason.ErrorReason(EvaluationErrorKind.FLAG_NOT_FOUND))); } if (user == null || user.Key == null) { Log.Warn("Feature flag evaluation called with null user or null user key. Returning default"); _eventProcessor.SendEvent(eventFactory.NewDefaultFeatureRequestEvent(featureFlag, user, defaultValue, EvaluationErrorKind.USER_NOT_SPECIFIED)); return(new EvaluationDetail <T>(defaultValueOfType, null, EvaluationReason.ErrorReason(EvaluationErrorKind.USER_NOT_SPECIFIED))); } FeatureFlag.EvalResult evalResult = featureFlag.Evaluate(user, _featureStore, eventFactory); if (!IsOffline()) { foreach (var prereqEvent in evalResult.PrerequisiteEvents) { _eventProcessor.SendEvent(prereqEvent); } } var evalDetail = evalResult.Result; EvaluationDetail <T> returnDetail; if (evalDetail.VariationIndex == null) { returnDetail = new EvaluationDetail <T>(defaultValueOfType, null, evalDetail.Reason); evalDetail = new EvaluationDetail <LdValue>(defaultValue, null, evalDetail.Reason); } else { if (checkType && !defaultValue.IsNull && evalDetail.Value.Type != defaultValue.Type) { Log.ErrorFormat("Expected type: {0} but got {1} when evaluating FeatureFlag: {2}. Returning default", defaultValue.Type, evalDetail.Value.Type, featureKey); _eventProcessor.SendEvent(eventFactory.NewDefaultFeatureRequestEvent(featureFlag, user, defaultValue, EvaluationErrorKind.WRONG_TYPE)); return(new EvaluationDetail <T>(defaultValueOfType, null, EvaluationReason.ErrorReason(EvaluationErrorKind.WRONG_TYPE))); } returnDetail = new EvaluationDetail <T>(converter.ToType(evalDetail.Value), evalDetail.VariationIndex, evalDetail.Reason); } _eventProcessor.SendEvent(eventFactory.NewFeatureRequestEvent(featureFlag, user, evalDetail, defaultValue)); return(returnDetail); } catch (Exception e) { Log.ErrorFormat("Encountered exception in LaunchDarkly client: {0} when evaluating feature key: {1} for user key: {2}", Util.ExceptionMessage(e), featureKey, user.Key); Log.Debug(e.ToString(), e); var reason = EvaluationReason.ErrorReason(EvaluationErrorKind.EXCEPTION); if (featureFlag == null) { _eventProcessor.SendEvent(eventFactory.NewUnknownFeatureRequestEvent(featureKey, user, defaultValue, EvaluationErrorKind.EXCEPTION)); } else { _eventProcessor.SendEvent(eventFactory.NewFeatureRequestEvent(featureFlag, user, new EvaluationDetail <LdValue>(defaultValue, null, reason), defaultValue)); } return(new EvaluationDetail <T>(defaultValueOfType, null, reason)); } }
public void Track(string name, JToken data, User user) { Track(name, user, LdValue.FromSafeValue(data)); }
/// <inheritdoc/> public EvaluationDetail <float> FloatVariationDetail(string key, User user, float defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Float, true, EventFactory.DefaultWithReasons)); }
public EvaluationDetail <JToken> JsonVariationDetail(string key, User user, JToken defaultValue) { return(Evaluate(key, user, LdValue.FromSafeValue(defaultValue), LdValue.Convert.UnsafeJToken, false, EventFactory.DefaultWithReasons)); }
/// <summary> /// Adds a key-value pair to the object being built. /// </summary> /// <param name="key">the key to add</param> /// <param name="value">the value to add</param> /// <returns>the same builder</returns> public ObjectBuilder Add(string key, LdValue value) { _builder.Add(key, value); return(this); }
/// <summary> /// Adds a key-value pair to the object being built. /// </summary> /// <param name="key">the key to add</param> /// <param name="value">the value to add</param> /// <returns>the same builder</returns> public ObjectBuilder Add(string key, string value) { _builder.Add(key, LdValue.Of(value)); return(this); }
/// <summary> /// Adds a value to the array being built. /// </summary> /// <param name="value">the value to add</param> /// <returns>the same builder</returns> public ArrayBuilder Add(double value) { _builder.Add(LdValue.Of(value)); return(this); }
/// <summary> /// Adds a value to the array being built. /// </summary> /// <param name="value">the value to add</param> /// <returns>the same builder</returns> public ArrayBuilder Add(string value) { _builder.Add(LdValue.Of(value)); return(this); }
/// <summary> /// Adds a value to the array being built. /// </summary> /// <param name="value">the value to add</param> /// <returns>the same builder</returns> public ArrayBuilder Add(LdValue value) { _builder.Add(value); return(this); }
public override T ToType(LdValue jsonValue) => _toTypeFn(jsonValue);
public IUserBuilderCanMakeAttributePrivate Custom(string name, LdValue value) { return(_builder.Custom(name, value)); }
/// <inheritdoc/> public LdValue JsonVariation(string key, User user, LdValue defaultValue) { return(Evaluate(key, user, defaultValue, LdValue.Convert.Json, false, EventFactory.Default).Value); }
/// <summary> /// Converts an <see cref="LdValue"/> to a value of the specified type. /// </summary> /// <remarks> /// This method should never throw an exception; if the conversion cannot be done, it /// should return <c>default(T)</c>. /// </remarks> /// <param name="jsonValue">an <see cref="LdValue"/></param> /// <returns>a value of this type</returns> abstract public T ToType(LdValue jsonValue);
/// <inheritdoc/> public EvaluationDetail <bool> BoolVariationDetail(string key, User user, bool defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Bool, true, EventFactory.DefaultWithReasons)); }
public static bool Apply(string op, LdValue uValue, LdValue cValue) { try { if (uValue.IsNull || cValue.IsNull) { return(false); } int comparison; switch (op) { case "in": if (uValue.Equals(cValue)) { return(true); } if (uValue.IsString || cValue.IsString) { return(StringOperator(uValue, cValue, (a, b) => a.Equals(b))); } if (TryCompareNumericValues(uValue, cValue, out comparison)) { return(comparison == 0); } break; case "endsWith": return(StringOperator(uValue, cValue, (a, b) => a.EndsWith(b))); case "startsWith": return(StringOperator(uValue, cValue, (a, b) => a.StartsWith(b))); case "matches": return(StringOperator(uValue, cValue, (a, b) => new Regex(b).IsMatch(a))); case "contains": return(StringOperator(uValue, cValue, (a, b) => a.Contains(b))); case "lessThan": if (TryCompareNumericValues(uValue, cValue, out comparison)) { return(comparison < 0); } break; case "lessThanOrEqual": if (TryCompareNumericValues(uValue, cValue, out comparison)) { return(comparison <= 0); } break; case "greaterThan": if (TryCompareNumericValues(uValue, cValue, out comparison)) { return(comparison > 0); } break; case "greaterThanOrEqual": if (TryCompareNumericValues(uValue, cValue, out comparison)) { return(comparison >= 0); } break; case "before": return(DateOperator(uValue, cValue, (a, b) => DateTime.Compare(a, b) < 0)); case "after": return(DateOperator(uValue, cValue, (a, b) => DateTime.Compare(a, b) > 0)); case "semVerEqual": return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) == 0)); case "semVerLessThan": return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) < 0)); case "semVerGreaterThan": return(SemVerOperator(uValue, cValue, (a, b) => a.ComparePrecedence(b) > 0)); default: return(false); } } catch (Exception e) { Log.DebugFormat("Got a possibly expected exception when applying operator: {0} to user Value: {1} and feature flag value: {2}. Exception message: {3}", e, op, uValue, cValue, Util.ExceptionMessage(e)); } return(false); }
/// <inheritdoc/> public EvaluationDetail <string> StringVariationDetail(string key, User user, string defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.String, true, EventFactory.DefaultWithReasons)); }
/// <inheritdoc/> public bool BoolVariation(string key, User user, bool defaultValue = false) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Bool, true, EventFactory.Default).Value); }
/// <inheritdoc/> public EvaluationDetail <LdValue> JsonVariationDetail(string key, User user, LdValue defaultValue) { return(Evaluate(key, user, defaultValue, LdValue.Convert.Json, false, EventFactory.DefaultWithReasons)); }
/// <inheritdoc/> public int IntVariation(string key, User user, int defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Int, true, EventFactory.Default).Value); }
public void Track(string name, User user, string data) { Track(name, user, LdValue.Of(data)); }
/// <inheritdoc/> public float FloatVariation(string key, User user, float defaultValue) { return(Evaluate(key, user, LdValue.Of(defaultValue), LdValue.Convert.Float, true, EventFactory.Default).Value); }
internal CustomEvent(long creationDate, string key, User user, LdValue data, double?metricValue) : base(creationDate, key, user) { LdValueData = data; MetricValue = metricValue; }
void Start() { LaunchDarkly.Client.LdValue flagValueDefault = LaunchDarkly.Client.LdValue.Of(showOptionsFeatureFlagDefault); LaunchDarklyClientBehavior.Instance.RegisterFeatureFlagChangedCallback(showOptionsFeatureFlagName, flagValueDefault, flagValueCallback, true); }