private static ISettingsNode ConvertNode(YamlScalarNode node, string name)
        {
            var scalar = ConvertToScalar(node);

            if (!Schema.TryParse(scalar, true, out _, out var value))
            {
                throw new YamlException($"Can't parse scalar '{scalar}'");
            }

            return(new ValueNode(name, FormatAsString(value)));
        }
Exemplo n.º 2
0
        private static object ReadEvent(EventReader reader)
        {
            // Read a plain scalar and decode it to a C# value
            if (reader.Accept <Scalar>())
            {
                var scalar = reader.Expect <Scalar>();

                // We try to parse scalar with an extended YamlSchema
                // If we find a int,double... -> convert it to the proper C# type
                string defaultTag;
                object value;
                return(DefaultSchema.TryParse(scalar, true, out defaultTag, out value) ? value : scalar.Value);
            }

            // Read a YAML sequence to a ScriptArray
            if (reader.Accept <SequenceStart>())
            {
                var array = new ScriptArray();
                reader.Expect <SequenceStart>();
                while (!reader.Accept <SequenceEnd>())
                {
                    array.Add(ReadEvent(reader));
                }
                reader.Expect <SequenceEnd>();
                return(array);
            }

            // Read a YAML mapping to a ScriptObject
            if (reader.Accept <MappingStart>())
            {
                var obj = new ScriptObject();
                reader.Expect <MappingStart>();
                while (!reader.Accept <MappingEnd>())
                {
                    var key   = ReadEvent(reader).ToString();
                    var value = ReadEvent(reader);
                    try
                    {
                        obj.Add(key, value);
                    }
                    catch (ArgumentException err)
                    {
                        throw new YamlException(reader.Parser.Current.Start, reader.Parser.Current.End, "Duplicate key", err);
                    }
                }
                reader.Expect <MappingEnd>();
                return(obj);
            }

            throw new YamlException(reader.Parser.Current.Start, reader.Parser.Current.End, $"Unsupported Yaml Event {reader.Parser.Current}");
        }