/// <summary>
 /// Clones the client With a change
 /// </summary>
 public static Client With(this Client client, IGetHttpRequestMessage getHttpRequestMessage)
 =>
 client != null ? new Client(
     client.SerializationAdapter,
     client.BaseUrl,
     client.DefaultRequestHeaders,
     client.logger is ILogger <Client> logger ? logger : null,
     client.createHttpClient,
     client.sendHttpRequestMessage,
     getHttpRequestMessage,
     client.ThrowExceptionOnFailure,
     client.Name) : throw new ArgumentNullException(nameof(client));
        public async Task <HttpResponseMessage> SendHttpRequestMessage <TRequestBody>(
            HttpClient httpClient,
            IGetHttpRequestMessage httpRequestMessageFunc,
            IRequest <TRequestBody> request,
            ILogger logger,
            ISerializationAdapter serializationAdapter)
        {
            if (httpClient == null)
            {
                throw new ArgumentNullException(nameof(httpClient));
            }
            if (httpRequestMessageFunc == null)
            {
                throw new ArgumentNullException(nameof(httpRequestMessageFunc));
            }
            if (request == default)
            {
                throw new ArgumentNullException(nameof(request));
            }

            logger ??= NullLogger.Instance;

            try
            {
                var httpRequestMessage = httpRequestMessageFunc.GetHttpRequestMessage(request, logger, serializationAdapter);

                logger.LogTrace(Messages.InfoAttemptingToSend, request);

                var httpResponseMessage = await httpClient.SendAsync(httpRequestMessage, request.CancellationToken).ConfigureAwait(false);

                logger.LogInformation(Messages.InfoSendReturnedNoException);

                return(httpResponseMessage);
            }
            catch (OperationCanceledException oce)
            {
                logger.LogError(oce, Messages.ErrorMessageOperationCancelled, request);
                throw;
            }
            catch (Exception ex)
            {
                logger.LogError(ex, Messages.ErrorOnSend, request);

                throw;
            }
        }