/// <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); }
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); }
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); }