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