in src/AutoRest.CSharp/LowLevel/Generation/DpgClientWriter.cs [450:539]
private static void WriteResponseClassifier(CodeWriter writer, string responseClassifierTypeName, StatusCodes[] statusCodes)
{
var hasStatusCodeRanges = statusCodes.Any(statusCode => statusCode.Family != null);
if (hasStatusCodeRanges)
{
// After fixing https://github.com/Azure/autorest.csharp/issues/2018 issue remove "hasStatusCodeRanges" condition and this class
using (writer.Scope($"private sealed class {responseClassifierTypeName}Override : {Configuration.ApiTypes.ResponseClassifierType}"))
{
if (Configuration.IsBranded)
{
using (writer.Scope($"public override bool {Configuration.ApiTypes.ResponseClassifierIsErrorResponseName}({Configuration.ApiTypes.HttpMessageType} message)"))
{
using (writer.Scope($"return message.{Configuration.ApiTypes.HttpMessageResponseName}.{Configuration.ApiTypes.HttpMessageResponseStatusName} switch", end: "};"))
{
foreach (var statusCode in statusCodes)
{
writer.Line($">= {statusCode.Family * 100:L} and < {statusCode.Family * 100 + 100:L} => false,");
}
writer.LineRaw("_ => true");
}
}
}
else
{
using (writer.Scope($"public override bool {Configuration.ApiTypes.ResponseClassifierIsErrorResponseName}({Configuration.ApiTypes.HttpMessageType} message, out bool isError)"))
{
writer.Line($"isError = false;");
using (writer.Scope($"if (message.Response is null)"))
{
writer.Line($"return false;");
}
using (writer.Scope($"isError = message.{Configuration.ApiTypes.HttpMessageResponseName}.{Configuration.ApiTypes.HttpMessageResponseStatusName} switch", end: "};"))
{
foreach (var statusCode in statusCodes)
{
writer.Line($">= {statusCode.Family * 100:L} and < {statusCode.Family * 100 + 100:L} => false,");
}
writer.LineRaw("_ => true");
}
writer.Line($"return true;");
}
writer.Line();
using (writer.Scope($"public override bool {Configuration.ApiTypes.ResponseClassifierIsErrorResponseName}({Configuration.ApiTypes.HttpMessageType} message, {typeof(Exception)} exception, out bool isRetriable)"))
{
writer.Line($"isRetriable = false;");
writer.Line($"return false;");
}
}
}
writer.Line();
}
writer.Line($"private static {Configuration.ApiTypes.ResponseClassifierType} _{responseClassifierTypeName.FirstCharToLowerCase()};");
if (hasStatusCodeRanges)
{
writer.Append($"private static {Configuration.ApiTypes.ResponseClassifierType} {responseClassifierTypeName} => _{responseClassifierTypeName.FirstCharToLowerCase()} ??= new ");
writer.Line($"{responseClassifierTypeName}Override();");
}
else
{
if (Configuration.IsBranded)
{
writer.Append($"private static {Configuration.ApiTypes.ResponseClassifierType} {responseClassifierTypeName} => _{responseClassifierTypeName.FirstCharToLowerCase()} ??= new ");
writer.Append($"{Configuration.ApiTypes.StatusCodeClassifierType}(");
writeStatusCodes(writer, statusCodes);
}
else
{
writer.Append($"private static {Configuration.ApiTypes.ResponseClassifierType} {responseClassifierTypeName} => _{responseClassifierTypeName.FirstCharToLowerCase()} ??= ");
writer.Append($"{Configuration.ApiTypes.StatusCodeClassifierType}.Create(");
writeStatusCodes(writer, statusCodes);
}
}
static void writeStatusCodes(CodeWriter writer, StatusCodes[] statusCodes)
{
writer.Append($"stackalloc ushort[]{{");
foreach (var statusCode in statusCodes)
{
if (statusCode.Code != null)
{
writer.Append($"{statusCode.Code}, ");
}
}
writer.RemoveTrailingComma();
writer.Line($"}});");
}
}