private static void WriteResponseClassifier()

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($"}});");
            }
        }