src/Elastic.Transport/Requests/Body/PostData.Serializable.cs (39 lines of code) (raw):
// Licensed to Elasticsearch B.V under one or more agreements.
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
// See the LICENSE file in the project root for more information
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using static Elastic.Transport.SerializationFormatting;
namespace Elastic.Transport;
public abstract partial class PostData
{
/// <summary>
/// Create a <see cref="PostData"/> instance that will serialize <paramref name="data"/> using
/// <see cref="Serializer"/>
/// </summary>
public static PostData Serializable<T>(T data) => new SerializableData<T>(data);
private class SerializableData<T> : PostData
{
private readonly T _serializable;
public SerializableData(T item)
{
Type = PostType.Serializable;
_serializable = item;
}
public static implicit operator SerializableData<T>(T serializableData) => new(serializableData);
public override void Write(Stream writableStream, ITransportConfiguration settings, bool disableDirectStreaming)
{
MemoryStream buffer = null;
var stream = writableStream;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
var indent = settings.PrettyJson ? Indented : None;
settings.RequestResponseSerializer.Serialize(_serializable, stream, indent);
FinishStream(writableStream, buffer, disableDirectStreaming);
}
public override async Task WriteAsync(Stream writableStream, ITransportConfiguration settings, bool disableDirectStreaming, CancellationToken cancellationToken)
{
MemoryStream buffer = null;
var stream = writableStream;
BufferIfNeeded(settings.MemoryStreamFactory, disableDirectStreaming, ref buffer, ref stream);
var indent = settings.PrettyJson ? Indented : None;
await settings.RequestResponseSerializer
.SerializeAsync(_serializable, stream, indent, cancellationToken)
.ConfigureAwait(false);
await FinishStreamAsync(writableStream, buffer, disableDirectStreaming, cancellationToken).ConfigureAwait(false);
}
}
}