private IEnumerable <(A, B)> EnumerateTuples(BsonDeserializationContext context, BsonDeserializationArgs args) { var reader = context.Reader; var keyDeserializationArgs = ArgumentHelper.GetSpecificDeserializationArgs(args); var valueDeserializationArgs = ArgumentHelper.GetSpecificDeserializationArgs(args, 1); reader.ReadStartArray(); while (reader.ReadBsonType() != BsonType.EndOfDocument) { A key = default; B value = default; var keySet = false; var valueSet = false; reader.ReadStartDocument(); while (reader.ReadBsonType() != BsonType.EndOfDocument) { var elementName = reader.ReadName(); switch (elementName) { case Key: keySet = true; key = _keySerializer.Deserialize(context, keyDeserializationArgs); break; case Value: valueSet = true; value = _valueSerializer.Deserialize(context, valueDeserializationArgs); break; default: throw new BsonSerializationException($"Unknown element name {elementName}"); } } reader.ReadEndDocument(); if (!keySet) { throw new BsonSerializationException("Missing key"); } if (!valueSet) { throw new BsonSerializationException("Missing value"); } yield return(key, value); } reader.ReadEndArray(); }
private static BsonDeserializationArgs GetValueDeserializationArgs(BsonDeserializationArgs args) => ArgumentHelper.GetSpecificDeserializationArgs(args, 1);
private static BsonDeserializationArgs GetItemDeserializationArgs(BsonDeserializationArgs optionArgs) => ArgumentHelper.GetSpecificDeserializationArgs(optionArgs);