diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs index 43c3dabf62c..7baa50bea9b 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/src/Providers/RestClientProvider.cs @@ -23,10 +23,8 @@ public class RestClientProvider : TypeProvider { private const string RepeatabilityRequestIdHeader = "Repeatability-Request-ID"; private const string RepeatabilityFirstSentHeader = "Repeatability-First-Sent"; - private const string MaxPageSizeParameterName = "maxpagesize"; private const string TopParameterName = "top"; private const string MaxCountParameterName = "maxCount"; - private const string ApiVersionParameterName = "api-version"; private static readonly Dictionary _knownSpecialHeaderParams = new(StringComparer.OrdinalIgnoreCase) { @@ -146,9 +144,9 @@ private ScmMethodProvider BuildCreateRequestMethod(InputServiceMethod serviceMet } // Add maxPageSize parameter if PageSizeParameterSegments is specified - if (pagingServiceMethod?.PagingMetadata.PageSizeParameterSegments?.Count > 0) + var pageSizeParameterName = GetPageSizeParameterName(pagingServiceMethod); + if (pageSizeParameterName != null) { - var pageSizeParameterName = pagingServiceMethod.PagingMetadata.PageSizeParameterSegments.Last(); reinjectedParamNames.Add(pageSizeParameterName); } @@ -294,9 +292,9 @@ private Dictionary GetReinjectedParametersMap( } // Add maxPageSize parameter if PageSizeParameterSegments is specified - if (pagingServiceMethod?.PagingMetadata.PageSizeParameterSegments?.Count > 0) + var pageSizeParameterName = GetPageSizeParameterName(pagingServiceMethod); + if (pageSizeParameterName != null) { - var pageSizeParameterName = pagingServiceMethod.PagingMetadata.PageSizeParameterSegments.Last(); // Find the parameter in the operation parameters var pageSizeParameter = operation.Parameters.FirstOrDefault(p => p.Name == pageSizeParameterName); if (pageSizeParameter != null) @@ -465,8 +463,10 @@ private List AppendQueryParameters(ScopedApi uri, InputOper } // Determine if we should update existing parameters or always append + InputPagingServiceMethod? pagingServiceMethod = _inputClient.Methods.OfType() + .FirstOrDefault(m => m.Operation == operation); bool shouldUpdateExisting = isNextLinkRequest && - ShouldUpdateReinjectedParameter(inputQueryParameter.SerializedName) && + ShouldUpdateReinjectedParameter(inputQueryParameter, pagingServiceMethod) && paramType?.IsCollection != true; MethodBodyStatement statement = shouldUpdateExisting @@ -857,11 +857,29 @@ private static bool TryGetSpecialHeaderParam(InputParameter inputParameter, [Not return false; } - private static bool ShouldUpdateReinjectedParameter(string parameterName) + private static string? GetPageSizeParameterName(InputPagingServiceMethod? pagingServiceMethod) { - return parameterName.Equals(MaxPageSizeParameterName, StringComparison.OrdinalIgnoreCase) || - parameterName.Equals(ApiVersionParameterName, StringComparison.OrdinalIgnoreCase); - // In the future, we can extend this to check multiple parameters + return pagingServiceMethod?.PagingMetadata?.PageSizeParameterSegments?.Count > 0 + ? pagingServiceMethod.PagingMetadata.PageSizeParameterSegments.Last() + : null; + } + + private static bool ShouldUpdateReinjectedParameter(InputParameter inputParameter, InputPagingServiceMethod? pagingServiceMethod) + { + // Check if this is an API version parameter + if (inputParameter.IsApiVersion) + { + return true; + } + + // Check if this is a max page size parameter + var pageSizeParameterName = GetPageSizeParameterName(pagingServiceMethod); + if (pageSizeParameterName != null && inputParameter.Name.Equals(pageSizeParameterName, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return false; } private static List GetSuccessStatusCodes(InputOperation operation)