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 51da81bc1cf..43c3dabf62c 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 @@ -24,6 +24,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) @@ -955,6 +957,13 @@ internal static List GetMethodParameters( continue; } + // For paging operations, rename "top" parameter to "maxCount" + if (serviceMethod is InputPagingServiceMethod && + string.Equals(inputParam.Name, TopParameterName, StringComparison.OrdinalIgnoreCase)) + { + inputParam.Update(name: MaxCountParameterName); + } + ParameterProvider? parameter = ScmCodeModelGenerator.Instance.TypeFactory.CreateParameter(inputParam)?.ToPublicInputParameter(); if (parameter is null) { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs index b5d7272863c..c7654a7d662 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.ClientModel/test/Providers/CollectionResultDefinitions/ListPageableTests.cs @@ -40,6 +40,36 @@ public void NoNextLinkOrContinuationTokenAsync() Assert.AreEqual(Helpers.GetExpectedFromFile(), file.Content); } + [Test] + public void TopParameterRenamedToMaxCountInPagingOperation() + { + var topParameter = InputFactory.QueryParameter("top", InputPrimitiveType.Int32); + var pagingMetadata = InputFactory.PagingMetadata(["items"], null, null); + var responseModel = InputFactory.Model("Response", properties: [ + InputFactory.Property("items", InputFactory.Array(InputPrimitiveType.String)) + ]); + var response = InputFactory.OperationResponse([200], responseModel); + var operation = InputFactory.Operation("getItems", parameters: [topParameter], responses: [response]); + var pagingMethod = InputFactory.PagingServiceMethod("getItems", operation, pagingMetadata: pagingMetadata); + var client = InputFactory.Client("testClient", methods: [pagingMethod]); + + MockHelpers.LoadMockGenerator(inputModels: () => [responseModel], clients: () => [client]); + + var restClientProviders = ScmCodeModelGenerator.Instance.OutputLibrary.TypeProviders + .OfType().ToList(); + + Assert.IsTrue(restClientProviders.Count > 0, "RestClientProvider should be generated"); + + var parameterNames = restClientProviders + .SelectMany(p => p.Methods) + .SelectMany(m => m.Signature.Parameters) + .Select(param => param.Name) + .ToList(); + + Assert.Contains("maxCount", parameterNames, "Should contain 'maxCount' parameter"); + Assert.IsFalse(parameterNames.Contains("top"), "Should not contain 'top' parameter after renaming"); + } + [Test] public void NoNextLinkOrContinuationTokenOfT() { diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs index 458afd617dc..1dfd9e14a5c 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator.Input/src/InputTypes/InputParameter.cs @@ -31,9 +31,17 @@ protected InputParameter( /// Update the instance with given parameters. /// /// The scope of the - public void Update(InputParameterScope scope) + /// The name of the + public void Update(InputParameterScope? scope = null, string? name = null) { - Scope = scope; + if (scope.HasValue) + { + Scope = scope.Value; + } + if (name != null) + { + Name = name; + } } public static InputParameterScope ParseScope(InputType type, string name, string? scope)