private string GenerateEnumerableMethodForSyncBatchApiEndpoint()

in src/JetBrains.Space.Generator/CodeGeneration/CSharp/Generators/CSharpApiModelResourceGenerator.cs [500:579]


    private string GenerateEnumerableMethodForSyncBatchApiEndpoint(ApiEndpoint apiEndpoint, string baseEndpointPath)
    {
        var requestBodyObject = apiEndpoint.RequestBody as ApiFieldType.Object;

        var indent = new Indent();
        var builder = new StringBuilder();

        var endpointPath = (baseEndpointPath + "/" + apiEndpoint.Path.Segments.ToPath()).TrimEnd('/');

        var methodNameForEndpoint = apiEndpoint.ToCSharpMethodName();

        var batchDataType = ((ApiFieldType.Object)apiEndpoint.ResponseBody!).GetBatchDataType()!;

        if (apiEndpoint.ResponseBody != null)
        {
            var methodParametersBuilder = new MethodParametersBuilder(_codeGenerationContext)
                .WithParametersForApiParameters(apiEndpoint.Parameters);

            if (apiEndpoint.RequestBody != null)
            {
                if (requestBodyObject != null && FeatureFlags.DoNotExposeRequestObjects)
                {
                    methodParametersBuilder = methodParametersBuilder
                        .WithParametersForApiFields(requestBodyObject.Fields);
                }
                else
                {
                    methodParametersBuilder = methodParametersBuilder
                        .WithParameter(
                            apiEndpoint.ToCSharpRequestBodyClassName(endpointPath)!,
                            "data");
                }
            }

            var partialType = "Partial<" + batchDataType.GetBatchElementTypeOrType().ToCSharpType(_codeGenerationContext) + ">";
            var funcType = $"Func<{partialType}, {partialType}>?";
            methodParametersBuilder = methodParametersBuilder
                .WithParameter(
                    funcType,
                    "partial",
                    CSharpExpression.NullLiteral);

            methodParametersBuilder = methodParametersBuilder
                .WithParameter(CSharpType.CancellationToken.Value,
                    "cancellationToken",
                    CSharpExpression.DefaultLiteral);

            builder.Append(
                indent.Wrap(GenerateMethodDocumentationForEndpoint(apiEndpoint, methodParametersBuilder)));
            builder.Append($"{indent}public IAsyncEnumerable<");
            builder.Append(batchDataType.ElementType.ToCSharpType(_codeGenerationContext));
            builder.Append(">");
            builder.Append($" {methodNameForEndpoint}AsyncEnumerable(");
            builder.Append(methodParametersBuilder.BuildMethodParametersList());
            builder.AppendLine(")");

            indent.Increment();
            builder.Append($"{indent}=> SyncBatchEnumerator.AllItems((batchEtag, batchCancellationToken) => ");

            builder.Append($"{methodNameForEndpoint}Async(");

            var partialTypeForBatch = "Partial<SyncBatch<" + batchDataType.GetBatchElementTypeOrType().ToCSharpType(_codeGenerationContext) + ">>";
            builder.Append(
                methodParametersBuilder
                    .WithDefaultValueForAllParameters(null)
                    .WithDefaultValueForParameter("batchInfo", "SyncBatchInfo.Since(batchEtag!, 100)") // REVIEW: SyncBatchInfo may have several variants in the future
                    .WithDefaultValueForParameter("partial", $"builder => {partialTypeForBatch}.Default().WithEtag().WithHasMore().WithData(partial != null ? partial : _ => {partialType}.Default())")
                    .WithDefaultValueForParameter(CSharpType.CancellationToken.Value, "batchCancellationToken")
                    .BuildMethodCallParameters());

            builder.Append("), cancellationToken);");
            indent.Decrement();
        }
        else
        {
            builder.AppendLine($"{indent}#warning UNSUPPORTED CASE - " + apiEndpoint.ToCSharpMethodName() + " - " + apiEndpoint.Method.ToHttpMethod() + " " + endpointPath);
        }

        return builder.ToString();
    }