private TestStruct ReadStruct(ref JReader r)
        {
            var obj = r.ObjectOrNull();

            if (!obj.IsDefined)
            {
                return(null);
            }
            var ret = new TestStruct();

            while (obj.Next(ref r))
            {
                switch (obj.Name)
                {
                case var n when n == "str":
                    ret.Str = r.String();
                    break;

                case var n when n == "nums":
                    ret.Nums = ReadInts(ref r);
                    break;

                case var n when n == "bool":
                    ret.Bool = r.Bool();
                    break;

                case var n when n == "nested":
                    ret.Nested = ReadStruct(ref r);
                    break;
                }
            }
            return(ret);
        }
Esempio n. 2
0
        internal static ImmutableList <string> ReadStrings(ref JReader r)
        {
            var builder = ImmutableList.CreateBuilder <string>();

            for (var arr = r.ArrayOrNull(); arr.Next(ref r);)
            {
                builder.Add(r.String());
            }
            return(builder.ToImmutable());
        }
        public object ReadJson(ref JReader reader)
        {
            string key = null;
            int    version = 0;
            bool   deleted = false;
            ImmutableList <string>      included = null, excluded = null;
            ImmutableList <SegmentRule> rules = null;
            string salt = null;

            for (var obj = reader.Object().WithRequiredProperties(_requiredProperties); obj.Next(ref reader);)
            {
                switch (obj.Name)
                {
                case var n when n == "key":
                    key = reader.String();
                    break;

                case var n when n == "version":
                    version = reader.Int();
                    break;

                case var n when n == "deleted":
                    deleted = reader.Bool();
                    break;

                case var n when n == "included":
                    included = SerializationHelpers.ReadStrings(ref reader);
                    break;

                case var n when n == "excluded":
                    excluded = SerializationHelpers.ReadStrings(ref reader);
                    break;

                case var n when n == "rules":
                    var rulesBuilder = ImmutableList.CreateBuilder <SegmentRule>();
                    for (var rulesArr = reader.Array(); rulesArr.Next(ref reader);)
                    {
                        rulesBuilder.Add(ReadSegmentRule(ref reader));
                    }
                    rules = rulesBuilder.ToImmutable();
                    break;

                case var n when n == "salt":
                    salt = reader.StringOrNull();
                    break;
                }
            }
            if (key is null && !deleted)
            {
                throw new RequiredPropertyException("key", 0);
            }
            return(new Segment(key, version, deleted, included, excluded, rules, salt));
        }
Esempio n. 4
0
        internal static ImmutableList <Clause> ReadClauses(ref JReader r)
        {
            var builder = ImmutableList.CreateBuilder <Clause>();

            for (var arr = r.ArrayOrNull(); arr.Next(ref r);)
            {
                UserAttribute           attribute = new UserAttribute();
                Operator                op        = null;
                ImmutableList <LdValue> values    = null;
                bool negate = false;
                for (var obj = r.Object(); obj.Next(ref r);)
                {
                    switch (obj.Name)
                    {
                    case var n when n == "attribute":
                        attribute = UserAttribute.ForName(r.String());
                        break;

                    case var n when n == "op":
                        op = Operator.ForName(r.String());
                        // Operator.ForName never returns null - unrecognized operators return a stub object
                        break;

                    case var n when n == "values":
                        values = ReadValues(ref r);
                        break;

                    case var n when n == "negate":
                        negate = r.Bool();
                        break;
                    }
                }
                builder.Add(new Clause(attribute, op, values, negate));
            }
            return(builder.ToImmutable());
        }
Esempio n. 5
0
        internal static Prerequisite ReadPrerequisite(ref JReader r)
        {
            string key       = null;
            int    variation = 0;

            for (var obj = r.Object(); obj.Next(ref r);)
            {
                switch (obj.Name)
                {
                case var n when n == "key":
                    key = r.String();
                    break;

                case var n when n == "variation":
                    variation = r.Int();
                    break;
                }
            }
            return(new Prerequisite(key, variation));
        }
Esempio n. 6
0
        public object ReadJson(ref JReader reader)
        {
            string key     = null;
            int    version = 0;
            bool   deleted = false;
            bool   on      = false;
            ImmutableList <Prerequisite> prerequisites = null;
            ImmutableList <Target>       targets       = null;
            ImmutableList <FlagRule>     rules         = null;
            string             salt        = null;
            VariationOrRollout fallthrough = new VariationOrRollout();
            int?offVariation = null;
            ImmutableList <LdValue> variations = null;
            bool trackEvents = false, trackEventsFallthrough = false;
            UnixMillisecondTime?debugEventsUntilDate = null;
            bool clientSide = false;

            for (var obj = reader.Object().WithRequiredProperties(_requiredProperties); obj.Next(ref reader);)
            {
                switch (obj.Name)
                {
                case var n when n == "key":
                    key = reader.String();
                    break;

                case var n when n == "version":
                    version = reader.Int();
                    break;

                case var n when n == "deleted":
                    deleted = reader.Bool();
                    break;

                case var n when n == "on":
                    on = reader.Bool();
                    break;

                case var n when n == "prerequisites":
                    var prereqsBuilder = ImmutableList.CreateBuilder <Prerequisite>();
                    for (var arr = reader.ArrayOrNull(); arr.Next(ref reader);)
                    {
                        prereqsBuilder.Add(ReadPrerequisite(ref reader));
                    }
                    prerequisites = prereqsBuilder.ToImmutable();
                    break;

                case var n when n == "targets":
                    var targetsBuilder = ImmutableList.CreateBuilder <Target>();
                    for (var arr = reader.ArrayOrNull(); arr.Next(ref reader);)
                    {
                        targetsBuilder.Add(ReadTarget(ref reader));
                    }
                    targets = targetsBuilder.ToImmutable();
                    break;

                case var n when n == "rules":
                    var rulesBuilder = ImmutableList.CreateBuilder <FlagRule>();
                    for (var arr = reader.ArrayOrNull(); arr.Next(ref reader);)
                    {
                        rulesBuilder.Add(ReadFlagRule(ref reader));
                    }
                    rules = rulesBuilder.ToImmutable();
                    break;

                case var n when n == "fallthrough":
                    fallthrough = ReadVariationOrRollout(ref reader);
                    break;

                case var n when n == "offVariation":
                    offVariation = reader.IntOrNull();
                    break;

                case var n when n == "variations":
                    variations = SerializationHelpers.ReadValues(ref reader);
                    break;

                case var n when n == "salt":
                    salt = reader.StringOrNull();
                    break;

                case var n when n == "trackEvents":
                    trackEvents = reader.Bool();
                    break;

                case var n when n == "trackEventsFallthrough":
                    trackEventsFallthrough = reader.Bool();
                    break;

                case var n when n == "debugEventsUntilDate":
                    var dt = reader.LongOrNull();
                    debugEventsUntilDate = dt.HasValue ? UnixMillisecondTime.OfMillis(dt.Value) : (UnixMillisecondTime?)null;
                    break;

                case var n when n == "clientSide":
                    clientSide = reader.Bool();
                    break;
                }
            }
            if (key is null && !deleted)
            {
                throw new RequiredPropertyException("key", 0);
            }
            return(new FeatureFlag(key, version, deleted, on, prerequisites, targets, rules, fallthrough,
                                   offVariation, variations, salt, trackEvents, trackEventsFallthrough, debugEventsUntilDate, clientSide));
        }
Esempio n. 7
0
            public object ReadJson(ref JReader reader)
            {
                var obj = reader.ObjectOrNull().WithRequiredProperties(_requiredProperties);

                if (!obj.IsDefined)
                {
                    return(null);
                }
                var builder = User.Builder("");

                try
                {
                    while (obj.Next(ref reader))
                    {
                        switch (obj.Name.ToString())
                        {
                        case "key":
                            builder.Key(reader.String());
                            break;

                        case "secondary":
                            builder.Secondary(reader.StringOrNull());
                            break;

                        case "ip":
                            builder.IPAddress(reader.StringOrNull());
                            break;

                        case "country":
                            builder.Country(reader.StringOrNull());
                            break;

                        case "firstName":
                            builder.FirstName(reader.StringOrNull());
                            break;

                        case "lastName":
                            builder.LastName(reader.StringOrNull());
                            break;

                        case "name":
                            builder.Name(reader.StringOrNull());
                            break;

                        case "avatar":
                            builder.Avatar(reader.StringOrNull());
                            break;

                        case "email":
                            builder.Email(reader.StringOrNull());
                            break;

                        case "anonymous":
                            builder.AnonymousOptional(reader.BoolOrNull());
                            break;

                        case "custom":
                            for (var customObj = reader.ObjectOrNull(); customObj.Next(ref reader);)
                            {
                                builder.Custom(customObj.Name.ToString(),
                                               LdValueConverter.ReadJsonValue(ref reader));
                            }
                            break;

                        case "privateAttributeNames":
                            var internalBuilder = builder as UserBuilder;
                            for (var arr = reader.ArrayOrNull(); arr.Next(ref reader);)
                            {
                                internalBuilder.AddPrivateAttribute(reader.String());
                            }
                            break;
                        }
                    }
                }
                catch (Exception e)
                {
                    throw reader.TranslateException(e);
                }
                return(builder.Build());
            }
Esempio n. 8
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);
                }
            }
Esempio n. 9
0
 public EvaluationReasonKind ReadJsonValue(ref JReader reader) =>
 FromIdentifier(reader.String());
Esempio n. 10
0
 public static EvaluationErrorKind ReadJsonValue(ref JReader reader) =>
 FromIdentifier(reader.String());
Esempio n. 11
0
 public static BigSegmentsStatus ReadJsonValue(ref JReader reader) =>
 FromIdentifier(reader.String());