示例#1
0
            public static void WriteJsonValue(EvaluationReason value, IValueWriter writer)
            {
                var obj = writer.Object();

                obj.Name("kind").String(EvaluationReasonKindConverter.ToIdentifier(value.Kind));
                switch (value.Kind)
                {
                case EvaluationReasonKind.RuleMatch:
                    obj.Name("ruleIndex").Int(value.RuleIndex ?? 0);
                    obj.Name("ruleId").String(value.RuleId);
                    break;

                case EvaluationReasonKind.PrerequisiteFailed:
                    obj.Name("prerequisiteKey").String(value.PrerequisiteKey);
                    break;

                case EvaluationReasonKind.Error:
                    obj.Name("errorKind").String(EvaluationErrorKindConverter.ToIdentifier(value.ErrorKind.Value));
                    break;
                }
                if (value.InExperiment)
                {
                    obj.Name("inExperiment").Bool(true); // omit property if false
                }
                if (value.BigSegmentsStatus.HasValue)
                {
                    obj.Name("bigSegmentsStatus").String(
                        BigSegmentsStatusConverter.ToIdentifier(value.BigSegmentsStatus.Value));
                }
                obj.End();
            }
示例#2
0
            private static EvaluationReason?ReadJsonInternal(ref JReader reader, bool nullable)
            {
                var obj = (nullable ? reader.ObjectOrNull() : reader.Object())
                          .WithRequiredProperties(_requiredProperties);

                if (!obj.IsDefined)
                {
                    return(null);
                }
                try
                {
                    EvaluationReasonKind kind           = EvaluationReasonKind.Error;
                    int?   ruleIndex                    = null;
                    string ruleId                       = null;
                    string prerequisiteKey              = null;
                    EvaluationErrorKind?errorKind       = null;
                    bool inExperiment                   = false;
                    BigSegmentsStatus?bigSegmentsStatus = null;

                    while (obj.Next(ref reader))
                    {
                        var name = obj.Name;
                        if (name == "kind")
                        {
                            try
                            {
                                kind = EvaluationReasonKindConverter.FromIdentifier(reader.String());
                            }
                            catch (ArgumentException)
                            {
                                throw new SyntaxException("unsupported value for \"kind\"", 0);
                            }
                        }
                        else if (name == "ruleIndex")
                        {
                            ruleIndex = reader.Int();
                        }
                        else if (name == "ruleId")
                        {
                            ruleId = reader.String();
                        }
                        else if (name == "prerequisiteKey")
                        {
                            prerequisiteKey = reader.String();
                        }
                        else if (name == "errorKind")
                        {
                            try
                            {
                                errorKind = EvaluationErrorKindConverter.FromIdentifier(reader.String());
                            }
                            catch (ArgumentException)
                            {
                                throw new SyntaxException("unsupported value for \"errorKind\"", 0);
                            }
                        }
                        else if (name == "inExperiment")
                        {
                            inExperiment = reader.Bool();
                        }
                        else if (name == "bigSegmentsStatus")
                        {
                            try
                            {
                                bigSegmentsStatus = BigSegmentsStatusConverter.FromIdentifier(reader.String());
                            }
                            catch (ArgumentException)
                            {
                                throw new SyntaxException("unsupported value for \"bigSegmentsStatus\"", 0);
                            }
                        }
                    }

                    EvaluationReason reason;
                    switch (kind) // it's guaranteed to have a value, otherwise there'd be a required property error above
                    {
                    case EvaluationReasonKind.Off:
                        reason = EvaluationReason.OffReason;
                        break;

                    case EvaluationReasonKind.Fallthrough:
                        reason = EvaluationReason.FallthroughReason;
                        break;

                    case EvaluationReasonKind.TargetMatch:
                        reason = EvaluationReason.TargetMatchReason;
                        break;

                    case EvaluationReasonKind.RuleMatch:
                        reason = EvaluationReason.RuleMatchReason(ruleIndex ?? 0, ruleId);
                        break;

                    case EvaluationReasonKind.PrerequisiteFailed:
                        reason = EvaluationReason.PrerequisiteFailedReason(prerequisiteKey);
                        break;

                    case EvaluationReasonKind.Error:
                        reason = EvaluationReason.ErrorReason(errorKind ?? EvaluationErrorKind.Exception);
                        break;

                    default:
                        return(null);
                    }
                    if (inExperiment)
                    {
                        reason = reason.WithInExperiment(true);
                    }
                    if (bigSegmentsStatus.HasValue)
                    {
                        reason = reason.WithBigSegmentsStatus(bigSegmentsStatus);
                    }
                    return(reason);
                }
                catch (Exception e)
                {
                    throw reader.TranslateException(e);
                }
            }