Example #1
0
        internal static object NodeToType(Type type, YamlNode node)
        {
            // special snowflake string
            if (type == typeof(String))
            {
                return(node.ToString());
            }

            // val primitives
            if (type.IsPrimitive)
            {
                return(StringToType(type, node.ToString()));
            }

            // val enum
            if (type.IsEnum)
            {
                return(Enum.Parse(type, node.ToString()));
            }

            // custom TypeSerializer
            if (_typeSerializers.TryGetValue(type, out var serializer))
            {
                return(serializer.NodeToType(type, node));
            }

            // other val (struct)
            if (type.IsValueType)
            {
                return(_structSerializer.NodeToType(type, (YamlMappingNode)node));
            }

            throw new ArgumentException($"Type {type.FullName} is not supported.", nameof(type));
        }
Example #2
0
        internal static object NodeToType(Type type, YamlNode node)
        {
            // special snowflake string
            if (type == typeof(String))
            {
                return(node.ToString());
            }

            // val primitives
            if (type.IsPrimitive)
            {
                return(StringToType(type, node.ToString()));
            }

            // val enum
            if (type.IsEnum)
            {
                return(Enum.Parse(type, node.ToString()));
            }

            // List<T>
            if (TryGenericListType(type, out var listType))
            {
                var listNode = (YamlSequenceNode)node;
                var newList  = (IList)Activator.CreateInstance(type);

                foreach (var entryNode in listNode)
                {
                    var value = NodeToType(listType, entryNode);
                    newList.Add(value);
                }

                return(newList);
            }

            // Dictionary<K,V>
            if (TryGenericDictType(type, out var keyType, out var valType))
            {
                var dictNode = (YamlMappingNode)node;
                var newDict  = (IDictionary)Activator.CreateInstance(type);

                foreach (var kvEntry in dictNode.Children)
                {
                    var keyValue = NodeToType(keyType, kvEntry.Key);
                    var valValue = NodeToType(valType, kvEntry.Value);

                    newDict.Add(keyValue, valValue);
                }

                return(newDict);
            }

            // custom TypeSerializer
            if (_typeSerializers.TryGetValue(type, out var serializer))
            {
                return(serializer.NodeToType(type, node));
            }

            // other val (struct)
            if (type.IsValueType)
            {
                return(_structSerializer.NodeToType(type, (YamlMappingNode)node));
            }

            // ref type that isn't a custom TypeSerializer
            throw new ArgumentException($"Type {type.FullName} is not supported.", nameof(type));
        }