in src/AutoRest.CSharp/Common/Generation/Writers/ResponseWriterHelpers.cs [18:119]
public static void WriteRawResponseToGeneric(CodeWriter writer, RestClientMethod operation, Output.Models.Responses.Response response, bool async, string? messageVariableName, FormattableString responseVariable)
{
var returnType = operation.ReturnType;
var headersModelType = operation.HeaderModel?.Type;
ReturnKind kind;
if (returnType != null && headersModelType != null)
{
kind = ReturnKind.HeadersAndValue;
}
else if (headersModelType != null)
{
kind = ReturnKind.Headers;
}
else if (returnType != null)
{
kind = ReturnKind.Value;
}
else
{
kind = ReturnKind.Response;
}
var responseBody = response.ResponseBody;
ReferenceOrConstant value = default;
var valueVariable = new CodeWriterDeclaration("value");
switch (responseBody)
{
case ObjectResponseBody objectResponseBody:
writer.Line($"{responseBody.Type} {valueVariable:D} = default;");
writer.WriteDeserializationForMethods(objectResponseBody.Serialization, async, new VariableReference(responseBody.Type, valueVariable), $"{responseVariable}.{Configuration.ApiTypes.ContentStreamName}", objectResponseBody.Type);
value = new Reference(valueVariable.ActualName, responseBody.Type);
break;
case StreamResponseBody _:
writer.Line($"var {valueVariable:D} = {messageVariableName}.ExtractResponseContent();");
value = new Reference(valueVariable.ActualName, responseBody.Type);
break;
case ConstantResponseBody body:
writer.Append($"{returnType} {valueVariable:D} = ");
writer.WriteReferenceOrConstant(body.Value);
writer.Line($";");
value = new Reference(valueVariable.ActualName, responseBody.Type);
break;
case StringResponseBody _:
var streamReaderVariable = new CodeWriterDeclaration("streamReader");
writer.Line($"{typeof(StreamReader)} {streamReaderVariable:D} = new {typeof(StreamReader)}({responseVariable}.{Configuration.ApiTypes.ContentStreamName});");
writer.Append($"{returnType} {valueVariable:D} = ");
if (async)
{
writer.Line($"await {streamReaderVariable}.ReadToEndAsync().ConfigureAwait(false);");
}
else
{
writer.Line($"{streamReaderVariable}.ReadToEnd();");
}
value = new Reference(valueVariable.ActualName, responseBody.Type);
break;
default:
{
if (returnType != null)
{
value = Constant.Default(returnType.WithNullable(true));
}
break;
}
}
switch (kind)
{
case ReturnKind.Response:
writer.Append($"return {responseVariable};");
break;
case ReturnKind.Headers:
writer.Append($"return {typeof(ResponseWithHeaders)}.FromValue(headers, {responseVariable});");
break;
case ReturnKind.HeadersAndValue:
writer.Append($"return {typeof(ResponseWithHeaders)}.FromValue");
if (!Equals(responseBody?.Type, operation.ReturnType))
{
writer.Append($"<{operation.ReturnType}, {headersModelType}>");
}
writer.Append($"(");
writer.WriteReferenceOrConstant(value);
writer.Append($", headers, {responseVariable});");
break;
case ReturnKind.Value:
writer.Append($"return {Configuration.ApiTypes.ResponseType}.FromValue");
if (!Equals(responseBody?.Type, operation.ReturnType))
{
writer.Append($"<{operation.ReturnType}>");
}
writer.Append($"(");
writer.WriteReferenceOrConstant(value);
writer.Append($", {responseVariable});");
break;
default:
throw new ArgumentOutOfRangeException();
}
}