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); }
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)); }
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()); }
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)); }
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)); }
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()); }
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); } }
public EvaluationReasonKind ReadJsonValue(ref JReader reader) => FromIdentifier(reader.String());
public static EvaluationErrorKind ReadJsonValue(ref JReader reader) => FromIdentifier(reader.String());
public static BigSegmentsStatus ReadJsonValue(ref JReader reader) => FromIdentifier(reader.String());