From 528c8418283213550e69e675cb6d8285f79fdf85 Mon Sep 17 00:00:00 2001 From: MattMo Date: Sun, 12 Oct 2025 18:45:23 -0700 Subject: [PATCH] Improved named parameter generating support. Added the ability to specify the min amount of parameters before converting to named parameters. Made the feature work across all functions of the client code. Bumped package to 1.9.1 --- Rest.Net.Example/Program.cs | 6 +++-- Rest.Net/Rest.Net.csproj | 2 +- Rest.Net/RestJavascriptClientGenerator.cs | 31 +++++++++++++++++++---- Rest.Net/RouteListener.cs | 4 ++- 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/Rest.Net.Example/Program.cs b/Rest.Net.Example/Program.cs index 98ce619..a08fad6 100644 --- a/Rest.Net.Example/Program.cs +++ b/Rest.Net.Example/Program.cs @@ -99,11 +99,11 @@ namespace MontoyaTech.Rest.Net.Example File.WriteAllText("Client.cs", listener.GenerateCSharpClient()); - File.WriteAllText("Client.js", listener.GenerateJavascriptClient(useJsonNames: true)); + File.WriteAllText("Client.js", listener.GenerateJavascriptClient(useJsonNames: true, namedParameters: true)); File.WriteAllText("StaticClient.cs", listener.GenerateCSharpClient("StaticClient", staticCode: true)); - File.WriteAllText("StaticClient.js", listener.GenerateJavascriptClient("StaticClient", staticCode: true, useJsonNames: true)); + File.WriteAllText("StaticClient.js", listener.GenerateJavascriptClient("StaticClient", staticCode: true, useJsonNames: true, namedParameters: true)); Console.WriteLine("Generated Client.cs, Client.js, StaticClient.cs, StaticClient.js"); @@ -155,6 +155,8 @@ namespace MontoyaTech.Rest.Net.Example Console.WriteLine("Download output:" + str); } + Console.WriteLine("Done. Starting listener."); + listener.Block(); } diff --git a/Rest.Net/Rest.Net.csproj b/Rest.Net/Rest.Net.csproj index f13b072..3c33dd9 100644 --- a/Rest.Net/Rest.Net.csproj +++ b/Rest.Net/Rest.Net.csproj @@ -17,7 +17,7 @@ MontoyaTech.Rest.Net MontoyaTech.Rest.Net True - 1.9.0 + 1.9.1 Logo_Symbol_Black_Outline.png README.md diff --git a/Rest.Net/RestJavascriptClientGenerator.cs b/Rest.Net/RestJavascriptClientGenerator.cs index 24ef589..344f40e 100644 --- a/Rest.Net/RestJavascriptClientGenerator.cs +++ b/Rest.Net/RestJavascriptClientGenerator.cs @@ -31,6 +31,11 @@ namespace MontoyaTech.Rest.Net /// public bool NamedParameters = false; + /// + /// The minimum number of parameters before using named parameters. Default is 0. + /// + public int NamedParameterMin = 0; + /// /// Generates a Javascript Client from a given set of routes and returns it. /// @@ -79,7 +84,11 @@ namespace MontoyaTech.Rest.Net writer.WriteLine("@param {Function} urlHandler An optional function to process request urls before they are sent. This must return the url."); writer.WriteLine("@param {Function} requestHandler An optional function to process requests before they are sent. This must return the request."); writer.Outdent().WriteLine("*/"); - writer.Write("static Init(baseUrl, urlHandler = null, requestHandler = null) ").WriteLine("{").Indent(); + if (this.NamedParameters) + writer.Write("static Init({ baseUrl, urlHandler = null, requestHandler = null } = {}) "); + else + writer.Write("static Init(baseUrl, urlHandler = null, requestHandler = null) "); + writer.WriteLine("{").Indent(); //Make sure the baseUrl isn't null or whitespace writer.WriteBreak().WriteLine("if (baseUrl == null || baseUrl == undefined || baseUrl.trim() == '') {").Indent(); @@ -110,7 +119,11 @@ namespace MontoyaTech.Rest.Net writer.WriteLine("@param {Function} urlHandler An optional function to process request urls before they are sent. This must return the url."); writer.WriteLine("@param {Function} requestHandler An optional function to process requests before they are sent. This must return the request."); writer.Outdent().WriteLine("*/"); - writer.Write("constructor(baseUrl, urlHandler = null, requestHandler = null) ").WriteLine("{").Indent(); + if (this.NamedParameters) + writer.Write("constructor({ baseUrl, urlHandler = null, requestHandler = null } = {}) "); + else + writer.Write("constructor(baseUrl, urlHandler = null, requestHandler = null) "); + writer.WriteLine("{").Indent(); //Make sure the baseUrl isn't null or whitespace writer.WriteBreak().WriteLine("if (baseUrl == null || baseUrl == undefined || baseUrl.trim() == '') {").Indent(); @@ -373,7 +386,10 @@ namespace MontoyaTech.Rest.Net writer.Outdent().WriteLine("*/"); writer.Write("constructor("); - writer.WriteAssert(this.UseJsonNames, "{"); + + var parameterCount = fields.Length + properties.Length; + + writer.WriteAssert(this.UseJsonNames && parameterCount > this.NamedParameterMin, "{ "); //Write the default fields foreach (var field in fields) @@ -393,7 +409,7 @@ namespace MontoyaTech.Rest.Net writer.WriteSeparator().Write(EscapeName(property.Name)).Write(" = ").Write(this.GetTypeDefaultValue(property.PropertyType)); } - writer.WriteAssert(this.UseJsonNames, "} = {}"); + writer.WriteAssert(this.UseJsonNames && parameterCount > this.NamedParameterMin, " } = {}"); writer.WriteLine(") {").Indent(); //Init the default fields @@ -650,7 +666,11 @@ namespace MontoyaTech.Rest.Net else writer.Write($"async {(routeName == null ? methodInfo.Name : routeName.Name)}("); - //Generate the functions parameters + int parameterCount = (parameters.Length - 1) + (routeRequest != null ? 1 : 0) + (routeResponse != null && routeResponse.Parameter ? 1 : 0); + + writer.WriteAssert(this.NamedParameters && parameterCount > this.NamedParameterMin, "{ "); + + //Generate the functions parameters, skip the default context parameter. if (parameters != null) { for (int i = 1; i < parameters.Length; i++) @@ -672,6 +692,7 @@ namespace MontoyaTech.Rest.Net writer.Write("input"); } + writer.WriteAssert(this.NamedParameters && parameterCount > this.NamedParameterMin, " } = {}"); writer.WriteLine(") {").Indent(); //Generate the url diff --git a/Rest.Net/RouteListener.cs b/Rest.Net/RouteListener.cs index 6a4b903..9392c12 100644 --- a/Rest.Net/RouteListener.cs +++ b/Rest.Net/RouteListener.cs @@ -257,8 +257,9 @@ namespace MontoyaTech.Rest.Net /// Whether or not to generate a static client. Default is false. /// Whether or not to use JSON Property name overrides during code generation. Default is false. /// Whether or not to generate routes that use named parameters over positional parameters. Default is false. + /// The minimum number of parameters before converting to named parameters. Default is 0. /// - public string GenerateJavascriptClient(string clientName = "Client", bool staticCode = false, bool useJsonNames = false, bool namedParameters = false) + public string GenerateJavascriptClient(string clientName = "Client", bool staticCode = false, bool useJsonNames = false, bool namedParameters = false, int namedParameterMin = 0) { var generator = new RestJavascriptClientGenerator(); @@ -266,6 +267,7 @@ namespace MontoyaTech.Rest.Net generator.StaticCode = staticCode; generator.UseJsonNames = useJsonNames; generator.NamedParameters = namedParameters; + generator.NamedParameterMin = namedParameterMin; return generator.Generate(this); }