Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4928a03

Browse files
authored
Enable use of external enums as URI and header params. (#65)
1 parent 6a63fb0 commit 4928a03

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/Facility.CodeGen.JavaScript/JavaScriptGenerator.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,6 +974,7 @@ private static string RenderUriComponent(ServiceFieldInfo field, ServiceInfo ser
974974
switch (fieldTypeKind)
975975
{
976976
case ServiceTypeKind.Enum:
977+
case ServiceTypeKind.ExternalEnum:
977978
return $"request.{fieldName}";
978979
case ServiceTypeKind.String:
979980
case ServiceTypeKind.Bytes:
@@ -987,6 +988,7 @@ private static string RenderUriComponent(ServiceFieldInfo field, ServiceInfo ser
987988
case ServiceTypeKind.Double:
988989
return $"encodeURIComponent(request.{fieldName}.toString())";
989990
case ServiceTypeKind.Dto:
991+
case ServiceTypeKind.ExternalDto:
990992
case ServiceTypeKind.Error:
991993
case ServiceTypeKind.Object:
992994
throw new NotSupportedException("Field type not supported on path/query: " + fieldTypeKind);
@@ -1002,6 +1004,7 @@ private string ParseFieldValue(ServiceFieldInfo field, ServiceInfo service, stri
10021004
switch (fieldTypeKind)
10031005
{
10041006
case ServiceTypeKind.Enum:
1007+
case ServiceTypeKind.ExternalEnum:
10051008
return $"{value}{IfTypeScript($" as {field.TypeName}")}";
10061009
case ServiceTypeKind.String:
10071010
case ServiceTypeKind.Bytes:
@@ -1016,6 +1019,7 @@ private string ParseFieldValue(ServiceFieldInfo field, ServiceInfo service, stri
10161019
case ServiceTypeKind.Double:
10171020
return $"parseFloat({value})";
10181021
case ServiceTypeKind.Dto:
1022+
case ServiceTypeKind.ExternalDto:
10191023
case ServiceTypeKind.Error:
10201024
case ServiceTypeKind.Object:
10211025
throw new NotSupportedException("Field type not supported on path/query/header: " + fieldTypeKind);
@@ -1031,6 +1035,7 @@ private static string RenderFieldValue(ServiceFieldInfo field, ServiceInfo servi
10311035
switch (fieldTypeKind)
10321036
{
10331037
case ServiceTypeKind.Enum:
1038+
case ServiceTypeKind.ExternalEnum:
10341039
case ServiceTypeKind.String:
10351040
case ServiceTypeKind.Bytes:
10361041
case ServiceTypeKind.DateTime:
@@ -1042,6 +1047,7 @@ private static string RenderFieldValue(ServiceFieldInfo field, ServiceInfo servi
10421047
case ServiceTypeKind.Double:
10431048
return $"{value}.toString()";
10441049
case ServiceTypeKind.Dto:
1050+
case ServiceTypeKind.ExternalDto:
10451051
case ServiceTypeKind.Error:
10461052
case ServiceTypeKind.Object:
10471053
throw new NotSupportedException("Field type not supported on path/query: " + fieldTypeKind);

tests/Facility.CodeGen.JavaScript.UnitTests/JavaScriptGeneratorTests.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,42 @@ public void GenerateExampleApiTypeScript_ExternEnumWithNameAndModule()
201201
Assert.That(typesFile.Text, Does.Contain("thing?: Thing;"));
202202
}
203203

204+
[Test]
205+
public void GenerateExampleApiTypeScript_ExternEnumAsUriParam()
206+
{
207+
const string definition = "[csharp] service TestApi { [js(name: \"SomeExternalEnum\", module: \"extern-enum-module\")] extern enum Thing; [http(method: GET, path: \"/myMethod\")] method myMethod { e: Thing; }: {} }";
208+
var parser = new FsdParser();
209+
var service = parser.ParseDefinition(new ServiceDefinitionText("TestApi.fsd", definition));
210+
var generator = new JavaScriptGenerator { GeneratorName = "JavaScriptGeneratorTests", TypeScript = true, Express = true };
211+
var result = generator.GenerateOutput(service);
212+
Assert.That(result, Is.Not.Null);
213+
214+
var typesFile = result.Files.Single(f => f.Name == "testApiTypes.ts");
215+
Assert.That(typesFile.Text, Does.Contain("export interface IMyMethodRequest"));
216+
Assert.That(typesFile.Text, Does.Contain("e?: Thing;"));
217+
218+
var serverFile = result.Files.Single(f => f.Name == "testApiServer.ts");
219+
Assert.That(serverFile.Text, Does.Contain("request.e = req.query['e'] as Thing;"));
220+
}
221+
222+
[Test]
223+
public void GenerateExampleApiTypeScript_ExternEnumAsHeader()
224+
{
225+
const string definition = "[csharp] service TestApi { [js(name: \"SomeExternalEnum\", module: \"extern-enum-module\")] extern enum Thing; [http(method: GET, path: \"/myMethod\")] method myMethod { [http(from: header, name: \"Thing-Header\")] e: Thing; }: {} }";
226+
var parser = new FsdParser();
227+
var service = parser.ParseDefinition(new ServiceDefinitionText("TestApi.fsd", definition));
228+
var generator = new JavaScriptGenerator { GeneratorName = "JavaScriptGeneratorTests", TypeScript = true, Express = true };
229+
var result = generator.GenerateOutput(service);
230+
Assert.That(result, Is.Not.Null);
231+
232+
var typesFile = result.Files.Single(f => f.Name == "testApiTypes.ts");
233+
Assert.That(typesFile.Text, Does.Contain("export interface IMyMethodRequest"));
234+
Assert.That(typesFile.Text, Does.Contain("e?: Thing;"));
235+
236+
var serverFile = result.Files.Single(f => f.Name == "testApiServer.ts");
237+
Assert.That(serverFile.Text, Does.Contain("request.e = req.header('Thing-Header');"));
238+
}
239+
204240
[Test]
205241
public void GenerateExampleApiTypeScript_ExternEnumWithoutJsAttribute()
206242
{

0 commit comments

Comments
 (0)