Esempio n. 1
0
        /// <summary>
        /// Tries to find a valid mapping entry.
        /// </summary>
        /// <param name="parser">The <see cref="ParsingEventBuffer"/> parser.</param>
        /// <param name="selector">The selector.</param>
        /// <param name="key">The key found.</param>
        /// <param name="value">The value found.</param>
        /// <returns><see langword="true"/> when a valid mapping entry is found; otherwise, <see langword="false"/>.</returns>
        public static bool TryFindMappingEntry(this ParsingEventBuffer parser, Func <Scalar, bool> selector, out Scalar key, out ParsingEvent value)
        {
            parser.Consume <MappingStart>();
            do
            {
                switch (parser.Current)
                {
                case Scalar scalar:
                    var keyMatched = selector(scalar);
                    parser.MoveNext();
                    if (keyMatched)
                    {
                        value = parser.Current;
                        key   = scalar;
                        return(true);
                    }

                    parser.SkipThisAndNestedEvents();
                    break;

                case MappingStart _:
                case SequenceStart _:
                    parser.SkipThisAndNestedEvents();
                    break;

                default:
                    parser.MoveNext();
                    break;
                }
            }while (parser.Current is not null);

            key   = null;
            value = null;
            return(false);
        }
Esempio n. 2
0
        public bool TryResolve(ParsingEventBuffer buffer, out Type suggestedType)
        {
            if (buffer.TryFindMappingEntry(
                    scalar => targetKey == scalar.Value,
                    out Scalar key,
                    out ParsingEvent value))
            {
                // read the value of the kind key
                if (value is Scalar valueScalar)
                {
                    suggestedType = CheckName(valueScalar.Value);

                    return(true);
                }
                else
                {
                    FailEmpty();
                }
            }

            // we could not find our key, thus we could not determine correct child type
            suggestedType = null;
            return(false);
        }
Esempio n. 3
0
        public bool TryResolve(ParsingEventBuffer buffer, out Type suggestedType)
        {
            if (buffer.TryFindMappingEntry(
                    scalar => typeLookup.ContainsKey(scalar.Value),
                    out Scalar key,
                    out ParsingEvent _))
            {
                suggestedType = typeLookup[key.Value];
                return(true);
            }

            buffer.Reset();
            if (buffer.TryFindMappingEntry(
                    scalar => fallback.Key == scalar.Value,
                    out Scalar _,
                    out ParsingEvent _))
            {
                suggestedType = fallback.Value;
                return(true);
            }

            suggestedType = null;
            return(false);
        }