public override PipelineContextData Clone()
        {
            var result = new ArrayContextData();

            if (m_items?.Count > 0)
            {
                result.m_items = new List <PipelineContextData>(m_items.Count);
                foreach (var item in m_items)
                {
                    result.m_items.Add(item);
                }
            }
            return(result);
        }
        public static PipelineContextData ToContextData(this TemplateToken token)
        {
            switch (token.Type)
            {
            case TokenType.Mapping:
                var mapping    = token as MappingToken;
                var dictionary = new DictionaryContextData();
                if (mapping.Count > 0)
                {
                    foreach (var pair in mapping)
                    {
                        var keyLiteral = pair.Key.AssertString("dictionary context data key");
                        var key        = keyLiteral.Value;
                        var value      = pair.Value.ToContextData();
                        dictionary.Add(key, value);
                    }
                }
                return(dictionary);

            case TokenType.Sequence:
                var sequence = token as SequenceToken;
                var array    = new ArrayContextData();
                if (sequence.Count > 0)
                {
                    foreach (var item in sequence)
                    {
                        array.Add(item.ToContextData());
                    }
                }
                return(array);

            case TokenType.Null:
                return(null);

            case TokenType.Boolean:
                var boolean = token as BooleanToken;
                return(new BooleanContextData(boolean.Value));

            case TokenType.Number:
                var number = token as NumberToken;
                return(new NumberContextData(number.Value));

            case TokenType.String:
                var stringToken = token as StringToken;
                return(new StringContextData(stringToken.Value));

            default:
                throw new NotSupportedException($"Unexpected {nameof(TemplateToken)} type '{token.Type}'");
            }
        }
Example #3
0
        public static PipelineContextData ToPipelineContextData(
            this JToken value,
            Int32 depth,
            Int32 maxDepth)
        {
            if (depth < maxDepth)
            {
                if (value.Type == JTokenType.String)
                {
                    return(new StringContextData((String)value));
                }
                else if (value.Type == JTokenType.Boolean)
                {
                    return(new BooleanContextData((Boolean)value));
                }
                else if (value.Type == JTokenType.Float || value.Type == JTokenType.Integer)
                {
                    return(new NumberContextData((Double)value));
                }
                else if (value.Type == JTokenType.Object)
                {
                    var subContext = new DictionaryContextData();
                    var obj        = (JObject)value;
                    foreach (var property in obj.Properties())
                    {
                        subContext[property.Name] = ToPipelineContextData(property.Value, depth + 1, maxDepth);
                    }
                    return(subContext);
                }
                else if (value.Type == JTokenType.Array)
                {
                    var arrayContext = new ArrayContextData();
                    var arr          = (JArray)value;
                    foreach (var element in arr)
                    {
                        arrayContext.Add(ToPipelineContextData(element, depth + 1, maxDepth));
                    }
                    return(arrayContext);
                }
                else if (value.Type == JTokenType.Null)
                {
                    return(null);
                }
            }

            // We don't understand the type or have reached our max, return as string
            return(new StringContextData(value.ToString()));
        }
        public override Object ReadJson(
            JsonReader reader,
            Type objectType,
            Object existingValue,
            JsonSerializer serializer)
        {
            switch (reader.TokenType)
            {
            case JsonToken.String:
                return(new StringContextData(reader.Value.ToString()));

            case JsonToken.Boolean:
                return(new BooleanContextData((Boolean)reader.Value));

            case JsonToken.Float:
                return(new NumberContextData((Double)reader.Value));

            case JsonToken.Integer:
                return(new NumberContextData((Double)(Int64)reader.Value));

            case JsonToken.StartObject:
                break;

            default:
                return(null);
            }

            Int32?  type  = null;
            JObject value = JObject.Load(reader);

            if (!value.TryGetValue("t", StringComparison.OrdinalIgnoreCase, out JToken typeValue))
            {
                type = PipelineContextDataType.String;
            }
            else if (typeValue.Type == JTokenType.Integer)
            {
                type = (Int32)typeValue;
            }
            else
            {
                return(existingValue);
            }

            Object newValue = null;

            switch (type)
            {
            case PipelineContextDataType.String:
                newValue = new StringContextData(null);
                break;

            case PipelineContextDataType.Array:
                newValue = new ArrayContextData();
                break;

            case PipelineContextDataType.Dictionary:
                newValue = new DictionaryContextData();
                break;

            case PipelineContextDataType.Boolean:
                newValue = new BooleanContextData(false);
                break;

            case PipelineContextDataType.Number:
                newValue = new NumberContextData(0);
                break;

            case PipelineContextDataType.CaseSensitiveDictionary:
                newValue = new CaseSensitiveDictionaryContextData();
                break;

            default:
                throw new NotSupportedException($"Unexpected {nameof(PipelineContextDataType)} '{type}'");
            }

            if (value != null)
            {
                using (JsonReader objectReader = value.CreateReader())
                {
                    serializer.Populate(objectReader, newValue);
                }
            }

            return(newValue);
        }