/// <summary>
    /// Generate the statements for HttpClient handler configuration.
    /// </summary>
    /// <param name="curlOptions">The curl options.</param>
    /// <returns>Collection of <see cref="MemberDeclarationSyntax" />.</returns>
    /// <remarks>
    /// var handler = new HttpClientHandler();
    /// handler.UseCookies = false;
    /// </remarks>
    private IEnumerable <MemberDeclarationSyntax> ConfigureHandlerStatements(CurlOptions curlOptions)
    {
        var statementSyntaxs = new LinkedList <MemberDeclarationSyntax>();

        var handlerInitialization = RoslynExtensions.CreateVariableFromNewObjectExpression(
            HandlerVariableName,
            nameof(HttpClientHandler));

        statementSyntaxs.AddLast(
            SyntaxFactory.GlobalStatement(SyntaxFactory.LocalDeclarationStatement(handlerInitialization)));

        if (curlOptions.HasCookies)
        {
            var memberAssignmentExpression = RoslynExtensions.CreateMemberAssignmentExpression(
                HandlerVariableName,
                "UseCookies",
                SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression));
            statementSyntaxs.AddLast(
                SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));
        }

        if (curlOptions.HasProxy && IsSupportedProxy(curlOptions.ProxyUri))
        {
            var memberAssignmentExpression = CreateProxyStatements(curlOptions);

            statementSyntaxs.AddLast(
                SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));
        }

        if (curlOptions.IsCompressed)
        {
            var memberAssignmentExpression = RoslynExtensions.CreateMemberAssignmentExpression(
                HandlerVariableName,
                "AutomaticDecompression",
                SyntaxFactory.PrefixUnaryExpression(SyntaxKind.BitwiseNotExpression, RoslynExtensions.CreateMemberAccessExpression("DecompressionMethods", "None")));

            memberAssignmentExpression = memberAssignmentExpression
                                         .PrependComment(Chars.NewLineString + "// If you are using .NET Core 3.0+ you can replace `~DecompressionMethods.None` to `DecompressionMethods.All`");

            statementSyntaxs.AddLast(SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));
        }

        if (curlOptions.HasCertificate && IsSupportedCertificate(curlOptions.CertificateType))
        {
            foreach (var declarationSyntax in CreateCertificateStatement(curlOptions))
            {
                statementSyntaxs.AddLast(declarationSyntax);
            }
        }

        if (curlOptions.Insecure)
        {
            var parameterListSyntax = RoslynExtensions.CreateParameterListSyntax(
                "requestMessage",
                "certificate",
                "chain",
                "policyErrors");
            var lambdaExpression = SyntaxFactory.ParenthesizedLambdaExpression(
                parameterListSyntax,
                SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression, SyntaxFactory.Token(SyntaxKind.TrueKeyword)));

            statementSyntaxs.AddLast(
                SyntaxFactory.GlobalStatement(
                    SyntaxFactory.ExpressionStatement(
                        RoslynExtensions.CreateMemberAssignmentExpression(
                            HandlerVariableName,
                            "ServerCertificateCustomValidationCallback",
                            lambdaExpression))));
        }

        statementSyntaxs.TryAppendWhiteSpaceAtEnd();

        return(statementSyntaxs);
    }
        /// <summary>
        /// Generate the statements for HttpClient handler configuration.
        /// </summary>
        /// <param name="curlOptions">The curl options.</param>
        /// <returns>Collection of <see cref="MemberDeclarationSyntax" />.</returns>
        /// <remarks>
        /// var handler = new HttpClientHandler();
        /// handler.UseCookies = false;
        /// </remarks>
        private IEnumerable <MemberDeclarationSyntax> ConfigureHandlerStatements(CurlOptions curlOptions)
        {
            var statementSyntaxs = new LinkedList <MemberDeclarationSyntax>();

            var handlerInitialization = RoslynExtensions.CreateVariableFromNewObjectExpression(
                HandlerVariableName,
                nameof(HttpClientHandler));

            statementSyntaxs.AddLast(
                SyntaxFactory.GlobalStatement(SyntaxFactory.LocalDeclarationStatement(handlerInitialization)));

            if (curlOptions.HasCookies)
            {
                var memberAssignmentExpression = RoslynExtensions.CreateMemberAssignmentExpression(
                    HandlerVariableName,
                    "UseCookies",
                    SyntaxFactory.LiteralExpression(SyntaxKind.FalseLiteralExpression));
                statementSyntaxs.AddLast(
                    SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));
            }

            if (curlOptions.HasProxy && IsSupportedProxy(curlOptions.ProxyUri))
            {
                var memberAssignmentExpression = CreateProxyStatements(curlOptions);

                statementSyntaxs.AddLast(
                    SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));
            }

            if (curlOptions.HasCertificate && IsSupportedCertificate(curlOptions.CertificateType))
            {
                var memberAssignmentExpression = RoslynExtensions.CreateMemberAssignmentExpression(
                    HandlerVariableName,
                    "ClientCertificateOptions",
                    RoslynExtensions.CreateMemberAccessExpression("ClientCertificateOption", "Manual"));

                statementSyntaxs.AddLast(
                    SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(memberAssignmentExpression)));

                var newCertificateArguments = new LinkedList <ArgumentSyntax>();
                newCertificateArguments.AddLast(RoslynExtensions.CreateStringLiteralArgument(curlOptions.CertificateFileName));
                if (curlOptions.HasCertificatePassword)
                {
                    newCertificateArguments.AddLast(RoslynExtensions.CreateStringLiteralArgument(curlOptions.CertificatePassword));
                }

                var newCertificateExpression = RoslynExtensions.CreateObjectCreationExpression(
                    "X509Certificate2",
                    newCertificateArguments.ToArray());
                var certificateAssignmentExpression = RoslynExtensions.CreateInvocationExpression(
                    HandlerVariableName,
                    "ClientCertificates",
                    "Add",
                    SyntaxFactory.Argument(newCertificateExpression));
                statementSyntaxs.AddLast(
                    SyntaxFactory.GlobalStatement(SyntaxFactory.ExpressionStatement(certificateAssignmentExpression)));
            }

            if (curlOptions.Insecure)
            {
                var parameterListSyntax = RoslynExtensions.CreateParameterListSyntax(
                    "requestMessage",
                    "certificate",
                    "chain",
                    "policyErrors");
                var lambdaExpression = SyntaxFactory.ParenthesizedLambdaExpression(
                    parameterListSyntax,
                    SyntaxFactory.LiteralExpression(SyntaxKind.TrueLiteralExpression, SyntaxFactory.Token(SyntaxKind.TrueKeyword)));

                statementSyntaxs.AddLast(
                    SyntaxFactory.GlobalStatement(
                        SyntaxFactory.ExpressionStatement(
                            RoslynExtensions.CreateMemberAssignmentExpression(
                                HandlerVariableName,
                                "ServerCertificateCustomValidationCallback",
                                lambdaExpression))));
            }

            statementSyntaxs.TryAppendWhiteSpaceAtEnd();

            return(statementSyntaxs);
        }