public static void WriteRequestCreation()

in src/AutoRest.CSharp/Common/Generation/Writers/RequestWriterHelpers.cs [37:242]


        public static void WriteRequestCreation(CodeWriter writer, RestClientMethod clientMethod, ClientFields fields, string? responseClassifierType, bool writeSDKUserAgent, IReadOnlyList<Parameter>? clientParameters = null)
        {
            using var methodScope = writer.AmbientScope();
            var parameters = clientMethod.Parameters;

            var methodName = CreateRequestMethodName(clientMethod.Name);
            writer.Append($"internal {Configuration.ApiTypes.HttpMessageType} {methodName}(");
            foreach (Parameter clientParameter in parameters)
            {
                writer.Append($"{clientParameter.Type} {clientParameter.Name:D},");
            }
            writer.RemoveTrailingComma();
            writer.Line($")");
            using (writer.Scope())
            {
                var message = new CodeWriterDeclaration("message");
                var request = new CodeWriterDeclaration("request");
                var uri = new CodeWriterDeclaration("uri");

                if (Configuration.IsBranded)
                {
                    if (clientMethod.Parameters.Contains(KnownParameters.RequestContext))
                    {
                        writer.Append($"var {message:D} = {Configuration.ApiTypes.GetHttpPipelineCreateMessageFormat(true)}");
                        if (responseClassifierType != default)
                        {
                            writer.Append($", {responseClassifierType}");
                        }
                        writer.Line($");");
                    }
                    else
                    {
                        writer.Line($"var {message:D} = {Configuration.ApiTypes.GetHttpPipelineCreateMessageFormat(false)});");
                    }
                }
                else
                {
                    writer.Line($"var {message:D} = _pipeline.CreateMessage();");
                    writer.Line($"{message}.ResponseClassifier = {responseClassifierType};");
                }

                writer.Line($"var {request:D} = {message}.{Configuration.ApiTypes.HttpMessageRequestName};");

                var method = clientMethod.Request.HttpMethod;
                if (!clientMethod.BufferResponse)
                {
                    writer.Line($"{message}.BufferResponse = false;");
                }
                writer.Line(Configuration.ApiTypes.GetSetMethodString(request.ActualName, method.Method));

                writer.Line($"var {uri:D} = new {Configuration.ApiTypes.RequestUriType}();");
                foreach (var segment in clientMethod.Request.PathSegments)
                {
                    var value = GetFieldReference(fields, segment.Value);
                    if (value.Type.IsFrameworkType && value.Type.FrameworkType == typeof(Uri))
                    {
                        writer.Append($"{uri}.Reset(");
                        WriteConstantOrParameter(writer, value, enumAsString: !segment.IsRaw);
                        writer.Line($");");
                    }
                    else if (!value.IsConstant && value.Reference.Name == "nextLink")
                    {
                        WritePathSegment(writer, uri, segment, value, "AppendRawNextLink");
                    }
                    else
                    {
                        WritePathSegment(writer, uri, segment, value);
                    }
                }

                //TODO: Duplicate code between query and header parameter processing logic
                foreach (var queryParameter in clientMethod.Request.Query)
                {
                    WriteQueryParameter(writer, uri, queryParameter, fields, clientParameters);
                }

                writer.Line(Configuration.ApiTypes.GetSetUriString(request.ActualName, uri.ActualName));

                WriteHeaders(writer, clientMethod, request, content: false, fields);

                switch (clientMethod.Request.Body)
                {
                    case RequestContentRequestBody body:
                        WriteHeaders(writer, clientMethod, request, content: true, fields);
                        writer.Line(Configuration.ApiTypes.GetSetContentString(request.ActualName, body.Parameter.Name));
                        break;
                    case SchemaRequestBody body:
                        using (WriteValueNullCheck(writer, body.Value))
                        {
                            WriteHeaders(writer, clientMethod, request, content: true, fields);
                            WriteSerializeContent(writer, request, body.Serialization, GetConstantOrParameter(body.Value, ignoreNullability: true, convertBinaryDataToArray: false));
                        }

                        break;
                    case BinaryRequestBody binaryBody:
                        using (WriteValueNullCheck(writer, binaryBody.Value))
                        {
                            WriteHeaders(writer, clientMethod, request, content: true, fields);
                            writer.Append($"{request}.Content = {Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}(");
                            WriteConstantOrParameter(writer, binaryBody.Value);
                            writer.Line($");");
                        }
                        break;
                    case TextRequestBody textBody:
                        using (WriteValueNullCheck(writer, textBody.Value))
                        {
                            WriteHeaders(writer, clientMethod, request, content: true, fields);
                            writer.Append($"{request}.Content = new {typeof(StringRequestContent)}(");
                            WriteConstantOrParameter(writer, textBody.Value);
                            writer.Line($");");
                        }
                        break;
                    case MultipartRequestBody multipartRequestBody:
                        WriteHeaders(writer, clientMethod, request, content: true, fields);

                        var multipartContent = new CodeWriterDeclaration("content");
                        writer.Line($"var {multipartContent:D} = new {typeof(MultipartFormDataContent)}();");

                        foreach (var bodyParameter in multipartRequestBody.RequestBodyParts)
                        {
                            switch (bodyParameter.Content)
                            {
                                case BinaryRequestBody binaryBody:
                                    using (WriteValueNullCheck(writer, binaryBody.Value))
                                    {
                                        writer.Append($"{multipartContent}.Add({Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}(");
                                        WriteConstantOrParameter(writer, binaryBody.Value);
                                        writer.Line($"), {bodyParameter.Name:L}, null);");
                                    }
                                    break;
                                case TextRequestBody textBody:
                                    using (WriteValueNullCheck(writer, textBody.Value))
                                    {
                                        writer.Append($"{multipartContent}.Add(new {typeof(StringRequestContent)}(");
                                        WriteConstantOrParameter(writer, textBody.Value);
                                        writer.Line($"), {bodyParameter.Name:L}, null);");
                                    }
                                    break;
                                case BinaryCollectionRequestBody collectionBody:
                                    var collectionItemVariable = new CodeWriterDeclaration("value");
                                    using (writer.Scope($"foreach (var {collectionItemVariable:D} in {collectionBody.Value.Reference.Name})"))
                                    {
                                        writer.Append($"{multipartContent}.Add({Configuration.ApiTypes.RequestContentType}.{Configuration.ApiTypes.RequestContentCreateName}({collectionItemVariable}), {bodyParameter.Name:L}, null);");
                                    }
                                    break;
                                default:
                                    throw new NotImplementedException(bodyParameter.Content?.GetType().FullName);
                            }
                        }
                        writer.Line($"{multipartContent}.ApplyToRequest({request});");
                        break;
                    case FlattenedSchemaRequestBody flattenedSchemaRequestBody:
                        WriteHeaders(writer, clientMethod, request, content: true, fields);

                        var initializers = new List<PropertyInitializer>();
                        foreach (var initializer in flattenedSchemaRequestBody.Initializers)
                        {
                            initializers.Add(new PropertyInitializer(initializer.Property.Declaration.Name, initializer.Property.Declaration.Type, initializer.Property.IsReadOnly, initializer.Value.GetReferenceOrConstantFormattable(), initializer.Value.Type));
                        }
                        var modelVariable = new CodeWriterDeclaration("model");
                        writer.WriteInitialization(
                                v => writer.Line($"var {modelVariable:D} = {v};"),
                                flattenedSchemaRequestBody.ObjectType,
                                flattenedSchemaRequestBody.ObjectType.InitializationConstructor,
                                initializers);

                        WriteSerializeContent(writer, request, flattenedSchemaRequestBody.Serialization, $"{modelVariable:I}");
                        break;
                    case UrlEncodedBody urlEncodedRequestBody:
                        var urlContent = new CodeWriterDeclaration("content");

                        WriteHeaders(writer, clientMethod, request, content: true, fields);
                        writer.Line($"var {urlContent:D} = new {typeof(FormUrlEncodedContent)}();");

                        foreach (var (name, value) in urlEncodedRequestBody.Values)
                        {
                            using (WriteValueNullCheck(writer, value))
                            {
                                writer.Append($"{urlContent}.Add({name:L},");
                                WriteConstantOrParameterAsString(writer, value);
                                writer.Line($");");
                            }
                        }
                        writer.Line($"{request}.Content = {urlContent};");
                        break;
                    case null:
                        break;
                    default:
                        throw new NotImplementedException(clientMethod.Request.Body?.GetType().FullName);
                }

                if (writeSDKUserAgent)
                {
                    writer.Line($"_userAgent.Apply({message});");
                }

                // we need to apply the RequestOptions in non-branded case as a last step
                if (!Configuration.IsBranded && clientMethod.Parameters.Contains(KnownParameters.RequestContext))
                {
                    writer.Line($"{message}.Apply({KnownParameters.RequestContext.Name:I});");
                }

                writer.Line($"return {message};");
            }
            writer.Line();
        }