Skip to content

Commit 17aa940

Browse files
committed
Support for form data parameters (C#), v2.18
1 parent 4844c88 commit 17aa940

File tree

17 files changed

+480
-400
lines changed

17 files changed

+480
-400
lines changed

src/NSwag.Annotations/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
[assembly: AssemblyCompany("Rico Suter")]
66
[assembly: AssemblyProduct("NSwag.Annotations")]
77
[assembly: AssemblyCopyright("Copyright © Rico Suter, 2015")]
8-
[assembly: AssemblyVersion("2.17.*")]
8+
[assembly: AssemblyVersion("2.18.*")]

src/NSwag.CodeGeneration.Tests/ClientGeneration/ArrayParameterTests.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
43
using System.Text;
54
using System.Threading.Tasks;
@@ -71,9 +70,11 @@ public void When_parameter_is_array_then_TypeScript_is_correct()
7170
var settings = new SwaggerToTypeScriptClientGeneratorSettings { ClassName = "MyClass" };
7271
var generator = new SwaggerToTypeScriptClientGenerator(service, settings);
7372
var code = generator.GenerateFile();
74-
73+
7574
//// Assert
76-
Assert.IsTrue(code.Contains(@"elementId.forEach(item => { url += ""elementId="" + encodeURIComponent("""" + item) + ""&""; });"));
75+
Assert.IsTrue(
76+
code.Contains(
77+
@"elementId.forEach(item => { url += ""elementId="" + encodeURIComponent("""" + item) + ""&""; });"));
7778
}
7879

7980
[TestMethod]
@@ -137,7 +138,10 @@ public void When_parameter_is_array_then_CSharp_is_correct()
137138
var code = generator.GenerateFile();
138139

139140
//// Assert
140-
Assert.IsTrue(code.Contains(@"foreach(var item_ in elementId) { url_ += string.Format(""elementId={0}&"", Uri.EscapeUriString(item_.ToString())); }"));
141+
Assert.IsTrue(
142+
code.Contains(
143+
@"foreach(var item_ in elementId) { url_ += string.Format(""elementId={0}&"", Uri.EscapeUriString(item_.ToString())); }"));
141144
}
145+
142146
}
143147
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using System.Collections.Generic;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using NJsonSchema;
4+
using NSwag.CodeGeneration.CodeGenerators.CSharp;
5+
6+
namespace NSwag.CodeGeneration.Tests.ClientGeneration
7+
{
8+
[TestClass]
9+
public class FormParameterTests
10+
{
11+
[TestMethod]
12+
public void When_form_parameters_are_defined_then_MultipartFormDataContent_is_generated()
13+
{
14+
//// Arrange
15+
var service = new SwaggerService();
16+
service.Paths["foo/bar"] = new SwaggerOperations
17+
{
18+
{
19+
SwaggerOperationMethod.Post,
20+
new SwaggerOperation
21+
{
22+
Parameters = new List<SwaggerParameter>
23+
{
24+
new SwaggerParameter
25+
{
26+
Name = "foo",
27+
Kind = SwaggerParameterKind.FormData,
28+
Type = JsonObjectType.String
29+
},
30+
new SwaggerParameter
31+
{
32+
Name = "bar",
33+
IsRequired = true,
34+
Kind = SwaggerParameterKind.FormData,
35+
Type = JsonObjectType.String
36+
}
37+
}
38+
}
39+
}
40+
};
41+
42+
//// Act
43+
var generator = new SwaggerToCSharpClientGenerator(service, new SwaggerToCSharpClientGeneratorSettings
44+
{
45+
46+
});
47+
var code = generator.GenerateFile();
48+
49+
//// Assert
50+
Assert.IsTrue(code.Contains("new MultipartFormDataContent"));
51+
Assert.IsTrue(code.Contains("if (foo != null)"));
52+
Assert.IsTrue(code.Contains("throw new ArgumentNullException(\"bar\");"));
53+
}
54+
}
55+
}

src/NSwag.CodeGeneration.Tests/NSwag.CodeGeneration.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@
7878
</Choose>
7979
<ItemGroup>
8080
<Compile Include="ClientGeneration\ArrayParameterTests.cs" />
81+
<Compile Include="ClientGeneration\FormParameterTests.cs" />
8182
<Compile Include="CodeGenerationTests.cs" />
8283
<Compile Include="CommandLine\WebApiCommandLineTests.cs" />
8384
<Compile Include="OperationNameGenerator\MultipleClientsFromOperationIdOperationNameGeneratorTests.cs" />

src/NSwag.CodeGeneration.Tests/Properties/AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@
3131
//
3232
// You can specify all the values or you can default the Build and Revision Numbers
3333
// by using the '*' as shown below:
34-
// [assembly: AssemblyVersion("2.17.*")]
34+
// [assembly: AssemblyVersion("2.18.*")]
3535
[assembly: AssemblyVersion("1.0.0.0")]
3636
[assembly: AssemblyFileVersion("1.0.0.0")]

src/NSwag.CodeGeneration/CodeGenerators/CSharp/Templates/Client.txt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,22 @@ public partial class <class> <if(hasBaseType)>: <endif><if(hasBaseClass)><baseCl
105105
<if(operation.IsGetOrDelete)>
106106
var response_ = await client_.<operation.HttpMethodUpper>Async(url_, cancellationToken).ConfigureAwait(false);
107107
<else>
108-
var response_ = await client_.<operation.HttpMethodUpper>Async(url_, new StringContent(string.Empty), cancellationToken).ConfigureAwait(false);
108+
<if(operation.HasFormParameters)>
109+
var content_ = new MultipartFormDataContent();
110+
<operation.FormParameters:{parameter |
111+
<if(parameter.IsOptional)>
112+
if (<parameter.VariableNameLower> != null)
113+
<else>
114+
if (<parameter.VariableNameLower> == null)
115+
throw new ArgumentNullException("<parameter.VariableNameLower>");
116+
else
117+
<endif>
118+
content_.Add(new StringContent(<parameter.VariableNameLower>.ToString()), "<parameter.Name>");
119+
}>
120+
<else>
121+
var content_ = new StringContent(string.Empty);
122+
<endif>
123+
var response_ = await client_.<operation.HttpMethodUpper>Async(url_, content_, cancellationToken).ConfigureAwait(false);
109124
<endif>
110125
ProcessResponse(client_, response_);
111126
<endif>

src/NSwag.CodeGeneration/CodeGenerators/ClientGeneratorBase.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ internal List<OperationModel> GetOperations<TGenerator>(SwaggerService service,
9494
HasResultType = HasResultType(operation),
9595
ResultDescription = GetResultDescription(operation),
9696
ExceptionType = GetExceptionType(operation),
97+
HasFormParameters = operation.Parameters.Any(p => p.Kind == SwaggerParameterKind.FormData),
9798
Responses = responses,
9899
DefaultResponse = defaultResponse,
99100
Parameters = operation.Parameters.Select(p =>

src/NSwag.CodeGeneration/CodeGenerators/Models/OperationModel.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,14 @@ internal class OperationModel
6464

6565
public IEnumerable<ParameterModel> HeaderParameters => Parameters.Where(p => p.Kind == SwaggerParameterKind.Header);
6666

67+
public IEnumerable<ParameterModel> FormParameters => Parameters.Where(p => p.Kind == SwaggerParameterKind.FormData);
68+
6769
public string Summary => ConversionUtilities.RemoveWhiteSpaces(Operation.Summary);
6870

6971
public bool HasSummary => !string.IsNullOrEmpty(Summary);
7072

7173
public bool HasDocumentation => HasSummary || HasResultDescription || Parameters.Any(p => p.HasDescription);
74+
75+
public bool HasFormParameters { get; set; }
7276
}
7377
}

src/NSwag.CodeGeneration/Infrastructure/AppDomainIsolation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ internal sealed class AppDomainIsolation<T> : IDisposable where T : MarshalByRef
1616
public AppDomainIsolation(string assemblyDirectory, string assemblyConfiguration)
1717
{
1818
if (string.IsNullOrEmpty(assemblyDirectory))
19-
throw new ArgumentNullException("assemblyDirectory");
19+
throw new ArgumentNullException(nameof(assemblyDirectory));
2020

2121
using (var transformer = new AssemblyConfigurationFileTransformer())
2222
{

src/NSwag.CodeGeneration/Infrastructure/AssemblyConfigurationFileTransformer.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace NSwag.CodeGeneration.Infrastructure
1616
{
1717
internal class AssemblyConfigurationFileTransformer : IDisposable
1818
{
19-
private string _transformedConfiguationPath = null;
19+
private string _transformedConfigurationPath = null;
2020

2121
public string GetConfigurationPath(string assemblyDirectory)
2222
{
@@ -32,7 +32,7 @@ public string GetConfigurationPath(string assemblyDirectory)
3232
RegexOptions.Singleline);
3333

3434
File.WriteAllText(configPath, content, Encoding.UTF8);
35-
_transformedConfiguationPath = configPath;
35+
_transformedConfigurationPath = configPath;
3636
return configPath;
3737
}
3838

@@ -41,10 +41,10 @@ public string GetConfigurationPath(string assemblyDirectory)
4141

4242
public void Dispose()
4343
{
44-
if (_transformedConfiguationPath != null)
44+
if (_transformedConfigurationPath != null)
4545
{
46-
File.Delete(_transformedConfiguationPath);
47-
_transformedConfiguationPath = null;
46+
File.Delete(_transformedConfigurationPath);
47+
_transformedConfigurationPath = null;
4848
}
4949
}
5050

0 commit comments

Comments
 (0)