Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
IAsyncEnumerableOfTConverter.cs
Go to the documentation of this file.
4
6
7internal sealed class IAsyncEnumerableOfTConverter<TAsyncEnumerable, TElement> : JsonCollectionConverter<TAsyncEnumerable, TElement> where TAsyncEnumerable : IAsyncEnumerable<TElement>
8{
9 private sealed class BufferedAsyncEnumerable : IAsyncEnumerable<TElement>
10 {
11 public readonly List<TElement> _buffer = new List<TElement>();
12
14 {
15 foreach (TElement item in _buffer)
16 {
17 yield return item;
18 }
19 }
20 }
21
30
31 protected override void Add(in TElement value, ref ReadStack state)
32 {
33 ((BufferedAsyncEnumerable)state.Current.ReturnValue)._buffer.Add(value);
34 }
35
40
42 {
43 if (!state.SupportContinuation)
44 {
46 }
47 return base.OnTryWrite(writer, value, options, ref state);
48 }
49
51 {
54 if (state.Current.AsyncDisposable == null)
55 {
56 asyncEnumerator = value.GetAsyncEnumerator(state.CancellationToken);
58 valueTask = asyncEnumerator.MoveNextAsync();
59 if (!valueTask.IsCompleted)
60 {
62 goto IL_00fb;
63 }
64 }
65 else
66 {
67 asyncEnumerator = (IAsyncEnumerator<TElement>)state.Current.AsyncDisposable;
68 if (state.Current.AsyncEnumeratorIsPendingCompletion)
69 {
70 valueTask = new ValueTask<bool>((Task<bool>)state.PendingTask);
72 state.PendingTask = null;
73 }
74 else
75 {
76 valueTask = new ValueTask<bool>(result: true);
77 }
78 }
80 do
81 {
82 if (!valueTask.Result)
83 {
85 state.AddCompletedAsyncDisposable(asyncEnumerator);
86 return true;
87 }
88 if (ShouldFlush(writer, ref state))
89 {
90 return false;
91 }
92 TElement value2 = asyncEnumerator.Current;
94 {
95 return false;
96 }
97 valueTask = asyncEnumerator.MoveNextAsync();
98 }
99 while (valueTask.IsCompleted);
100 goto IL_00fb;
101 IL_00fb:
102 state.PendingTask = valueTask.AsTask();
104 return false;
105 }
106}
void Add(TKey key, TValue value)
override bool OnTryRead(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, ref ReadStack state, out TAsyncEnumerable value)
override bool OnWriteResume(Utf8JsonWriter writer, TAsyncEnumerable value, JsonSerializerOptions options, ref WriteStack state)
override bool OnTryWrite(Utf8JsonWriter writer, TAsyncEnumerable value, JsonSerializerOptions options, ref WriteStack state)
override void CreateCollection(ref Utf8JsonReader reader, ref ReadStack state, JsonSerializerOptions options)
static void ThrowNotSupportedException_CannotPopulateCollection(Type type, ref Utf8JsonReader reader, ref ReadStack state)
static void ThrowNotSupportedException_TypeRequiresAsyncSerialization(Type propertyType)