private void WriteClientCtors()

in src/AutoRest.CSharp/DataPlane/Generation/DataPlaneClientWriter.cs [127:260]


        private void WriteClientCtors(CodeWriter writer, DataPlaneClient client, DataPlaneOutputLibrary library)
        {
            writer.Line();
            writer.WriteXmlDocumentationSummary($"Initializes a new instance of {client.Type.Name} for mocking.");
            using (writer.Scope($"protected {client.Type.Name:D}()"))
            {
            }
            writer.Line();

            var clientOptionsName = library.ClientOptions!.Declaration.Name;

            if (library.Authentication.ApiKey != null)
            {
                var ctorParams = client.GetClientConstructorParameters(Configuration.ApiTypes.KeyCredentialType);
                writer.WriteXmlDocumentationSummary($"Initializes a new instance of {client.Type.Name}");
                foreach (Parameter parameter in ctorParams)
                {
                    writer.WriteXmlDocumentationParameter(parameter.Name, $"{parameter.Description}");
                }
                writer.WriteXmlDocumentationParameter(OptionsVariable, $"The options for configuring the client.");

                writer.Append($"public {client.Type.Name:D}(");
                foreach (Parameter parameter in ctorParams)
                {
                    writer.WriteParameter(parameter);
                }
                writer.Append($" {clientOptionsName} {OptionsVariable} = null)");

                using (writer.Scope())
                {
                    writer.WriteParameterNullChecks(ctorParams);
                    writer.Line();

                    writer.Line($"{OptionsVariable} ??= new {clientOptionsName}();");
                    writer.Line($"{ClientDiagnosticsField.GetReferenceFormattable()} = new {typeof(ClientDiagnostics)}({OptionsVariable});");
                    writer.Line(Configuration.ApiTypes.GetHttpPipelineKeyCredentialString(PipelineField, OptionsVariable, CredentialVariable, library.Authentication.ApiKey.Name));
                    writer.Append($"this.RestClient = new {client.RestClient.Type}(");
                    foreach (var parameter in client.RestClient.Parameters)
                    {
                        if (parameter.IsApiVersionParameter)
                        {
                            writer.Append($"{OptionsVariable}.Version, ");
                        }
                        else if (parameter == KnownParameters.ClientDiagnostics)
                        {
                            writer.Append($"{ClientDiagnosticsField.GetReferenceFormattable()}, ");
                        }
                        else if (parameter == KnownParameters.Pipeline)
                        {
                            writer.Append($"{PipelineField}, ");
                        }
                        else
                        {
                            writer.Append($"{parameter.Name}, ");
                        }
                    }
                    writer.RemoveTrailingComma();
                    writer.Append($");");
                }
                writer.Line();
            }

            if (library.Authentication.OAuth2 != null)
            {
                var ctorParams = client.GetClientConstructorParameters(typeof(TokenCredential));
                writer.WriteXmlDocumentationSummary($"Initializes a new instance of {client.Type.Name}");
                foreach (Parameter parameter in ctorParams)
                {
                    writer.WriteXmlDocumentationParameter(parameter.Name, $"{parameter.Description}");
                }
                writer.WriteXmlDocumentationParameter(OptionsVariable, $"The options for configuring the client.");

                writer.Append($"public {client.Type.Name:D}(");
                foreach (Parameter parameter in ctorParams)
                {
                    writer.WriteParameter(parameter);
                }
                writer.Append($" {clientOptionsName} {OptionsVariable} = null)");

                using (writer.Scope())
                {
                    writer.WriteParameterNullChecks(ctorParams);
                    writer.Line();

                    writer.Line($"{OptionsVariable} ??= new {clientOptionsName}();");
                    writer.Line($"{ClientDiagnosticsField.GetReferenceFormattable()} = new {typeof(ClientDiagnostics)}({OptionsVariable});");
                    var scopesParam = new CodeWriterDeclaration("scopes");
                    writer.Append($"string[] {scopesParam:D} = ");
                    writer.Append($"{{ ");
                    foreach (var credentialScope in library.Authentication.OAuth2.Scopes)
                    {
                        writer.Append($"{credentialScope:L}, ");
                    }
                    writer.RemoveTrailingComma();
                    writer.Line($"}};");

                    writer.Line(Configuration.ApiTypes.GetHttpPipelineBearerString(PipelineField, OptionsVariable, CredentialVariable, scopesParam));
                    writer.Append($"this.RestClient = new {client.RestClient.Type}(");
                    foreach (var parameter in client.RestClient.Parameters)
                    {
                        if (parameter.IsApiVersionParameter)
                        {
                            writer.Append($"{OptionsVariable}.Version, ");
                        }
                        else if (parameter == KnownParameters.ClientDiagnostics)
                        {
                            writer.Append($"{ClientDiagnosticsField.GetReferenceFormattable()}, ");
                        }
                        else if (parameter == KnownParameters.Pipeline)
                        {
                            writer.Append($"{PipelineField}, ");
                        }
                        else
                        {
                            writer.Append($"{parameter.Name}, ");
                        }
                    }
                    writer.RemoveTrailingComma();
                    writer.Append($");");
                }
                writer.Line();
            }

            var internalConstructor = BuildInternalConstructor(client);
            writer.WriteMethodDocumentation(internalConstructor);
            using (writer.WriteMethodDeclaration(internalConstructor))
            {
                writer
                    .Line($"this.RestClient = new {client.RestClient.Type}({client.RestClient.Parameters.GetIdentifiersFormattable()});")
                    .Line($"{ClientDiagnosticsField.GetReferenceFormattable()} = {KnownParameters.ClientDiagnostics.Name:I};")
                    .Line($"{PipelineField} = {KnownParameters.Pipeline.Name:I};");
            }
            writer.Line();
        }