in src/Elastic.Transport/Requests/Body/PostData.MultiJson.cs [19:156]
public static PostData MultiJson(IEnumerable<string> listOfString) =>
new PostDataMultiJson<string>(listOfString);
/// <summary>
/// Create a <see cref="PostData"/> instance that will serialize the <paramref name="listOfSerializables"/> as multiline/ndjson.
/// </summary>
public static PostData MultiJson<T>(IEnumerable<T> listOfSerializables) =>
new PostDataMultiJson<T>(listOfSerializables);
private class PostDataMultiJson<T> : PostData
{
private readonly IEnumerable<T>? _enumerableOfObject;
private readonly IEnumerable<string>? _enumerableOfStrings;
protected internal PostDataMultiJson(IEnumerable<string> item)
{
_enumerableOfStrings = item;
Type = PostType.EnumerableOfString;
}
protected internal PostDataMultiJson(IEnumerable<T> item)
{
_enumerableOfObject = item;
Type = PostType.EnumerableOfObject;
}
public override void Write(Stream writableStream, ITransportConfiguration settings, bool disableDirectStreaming)
{
if (Type != PostType.EnumerableOfObject && Type != PostType.EnumerableOfString)
throw new Exception(
$"{nameof(PostDataMultiJson<T>)} only does not support {nameof(PostType)}.{Type.GetStringValue()}");
MemoryStream? buffer = null;
var stream = writableStream;
switch (Type)
{
case PostType.EnumerableOfString:
{
if (_enumerableOfStrings == null) return;
using var enumerator = _enumerableOfStrings.GetEnumerator();
if (!enumerator.MoveNext())
return;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
do
{
var bytes = enumerator.Current.Utf8Bytes();
stream.Write(bytes, 0, bytes.Length);
stream.Write(NewLineByteArray, 0, 1);
} while (enumerator.MoveNext());
break;
}
case PostType.EnumerableOfObject:
{
if (_enumerableOfObject == null) return;
using var enumerator = _enumerableOfObject.GetEnumerator();
if (!enumerator.MoveNext())
return;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
do
{
var o = enumerator.Current;
settings.RequestResponseSerializer.Serialize(o, stream, SerializationFormatting.None);
stream.Write(NewLineByteArray, 0, 1);
} while (enumerator.MoveNext());
break;
}
default:
throw new ArgumentOutOfRangeException();
}
FinishStream(writableStream, buffer, disableDirectStreaming);
}
public override async Task WriteAsync(Stream writableStream, ITransportConfiguration settings, bool disableDirectStreaming, CancellationToken cancellationToken)
{
if (Type != PostType.EnumerableOfObject && Type != PostType.EnumerableOfString)
throw new Exception(
$"{nameof(PostDataMultiJson<T>)} only does not support {nameof(PostType)}.{Type.GetStringValue()}");
MemoryStream? buffer = null;
var stream = writableStream;
switch (Type)
{
case PostType.EnumerableOfString:
{
if (_enumerableOfStrings == null)
return;
using var enumerator = _enumerableOfStrings.GetEnumerator();
if (!enumerator.MoveNext())
return;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
do
{
var bytes = enumerator.Current.Utf8Bytes();
await stream.WriteAsync(bytes, 0, bytes.Length, cancellationToken).ConfigureAwait(false);
await stream.WriteAsync(NewLineByteArray, 0, 1, cancellationToken).ConfigureAwait(false);
} while (enumerator.MoveNext());
break;
}
case PostType.EnumerableOfObject:
{
if (_enumerableOfObject == null)
return;
using var enumerator = _enumerableOfObject.GetEnumerator();
if (!enumerator.MoveNext())
return;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
do
{
var o = enumerator.Current;
await settings.RequestResponseSerializer.SerializeAsync(o, stream,
SerializationFormatting.None, cancellationToken)
.ConfigureAwait(false);
await stream.WriteAsync(NewLineByteArray, 0, 1, cancellationToken).ConfigureAwait(false);
} while (enumerator.MoveNext());
break;
}
default:
throw new ArgumentOutOfRangeException();
}
await FinishStreamAsync(writableStream, buffer, disableDirectStreaming, cancellationToken).ConfigureAwait(false);
}
}