Skip to content

Commit 047ceea

Browse files
authored
Add unity 2019 support and update samples (#21036)
1 parent 6b13ad5 commit 047ceea

File tree

15 files changed

+272
-29
lines changed

15 files changed

+272
-29
lines changed

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java

+1
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,7 @@ public void processOpts() {
924924
addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir);
925925
supportingFiles.add(new SupportingFile("ConnectionException.mustache", clientPackageDir, "ConnectionException.cs"));
926926
supportingFiles.add(new SupportingFile("UnexpectedResponseException.mustache", clientPackageDir, "UnexpectedResponseException.cs"));
927+
supportingFiles.add(new SupportingFile("UnityWebRequestAwaiterExtension.mustache", clientPackageDir, "UnityWebRequestAwaiterExtension.cs"));
927928
break;
928929
default: // generichost
929930
addGenericHostSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir);

modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ApiClient.mustache

+29-8
Original file line numberDiff line numberDiff line change
@@ -377,10 +377,18 @@ namespace {{packageName}}.Client
377377
378378
using (request)
379379
{
380+
{{#useIntForTimeout}}
380381
if (configuration.Timeout > 0)
381382
{
382-
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
383+
request.timeout = configuration.Timeout;
383384
}
385+
{{/useIntForTimeout}}
386+
{{^useIntForTimeout}}
387+
if (configuration.Timeout > TimeSpan.Zero)
388+
{
389+
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
390+
}
391+
{{/useIntForTimeout}}
384392

385393
if (configuration.Proxy != null)
386394
{
@@ -400,21 +408,34 @@ namespace {{packageName}}.Client
400408

401409
InterceptRequest(request, path, options, configuration);
402410

411+
#if UNITY_2020_2_OR_NEWER
412+
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
403413
var asyncOp = request.SendWebRequest();
404-
405-
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
406-
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
407-
414+
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
415+
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
408416
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
409417
{
410-
await tsc.Task;
418+
await tcs.Task;
411419
}
412-
420+
413421
if (request.result == UnityWebRequest.Result.ConnectionError ||
414422
request.result == UnityWebRequest.Result.DataProcessingError)
415423
{
416424
throw new ConnectionException(request);
417425
}
426+
#else
427+
// For Unity 2019 and earlier, await the operation directly.
428+
var asyncOp = request.SendWebRequest();
429+
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
430+
{
431+
await asyncOp;
432+
}
433+
434+
if (request.isNetworkError || request.isHttpError)
435+
{
436+
throw new ConnectionException(request);
437+
}
438+
#endif
418439

419440
object responseData = deserializer.Deserialize<T>(request);
420441

@@ -636,4 +657,4 @@ namespace {{packageName}}.Client
636657
}
637658
#endregion ISynchronousClient
638659
}
639-
}
660+
}

modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ConnectionException.mustache

+36
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ using UnityEngine.Networking;
55

66
namespace {{packageName}}.Client
77
{
8+
#if UNITY_2020_1_OR_NEWER
89
public class ConnectionException : Exception
910
{
1011
public UnityWebRequest.Result Result { get; private set; }
@@ -18,4 +19,39 @@ namespace {{packageName}}.Client
1819
Error = request.error ?? "";
1920
}
2021
}
22+
#else
23+
// For Unity 2019, define a custom enum that roughly simulates UnityWebRequest.Result.
24+
public enum UnityWebRequestResultLegacy
25+
{
26+
Success,
27+
ConnectionError,
28+
ProtocolError,
29+
DataProcessingError
30+
}
31+
32+
public class ConnectionException : Exception
33+
{
34+
public UnityWebRequestResultLegacy Result { get; private set; }
35+
public string Error { get; private set; }
36+
37+
public ConnectionException(UnityWebRequest request)
38+
: base($"Error: {request.error}")
39+
{
40+
if (request.isNetworkError)
41+
{
42+
Result = UnityWebRequestResultLegacy.ConnectionError;
43+
}
44+
else if (request.isHttpError)
45+
{
46+
Result = UnityWebRequestResultLegacy.ProtocolError;
47+
}
48+
else
49+
{
50+
Result = UnityWebRequestResultLegacy.Success;
51+
}
52+
53+
Error = request.error ?? "";
54+
}
55+
}
56+
#endif
2157
}

modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/README.mustache

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
2020
<a id="version-support"></a>
2121
## Version support
2222
This generator should support all current LTS versions of Unity
23-
- Unity 2020.3 (LTS) and up
23+
- Unity 2019.4 (LTS) and up
2424
- .NET Standard 2.1 / .NET Framework
2525

2626
<a id="dependencies"></a>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{{>partial_header}}
2+
3+
using System.Runtime.CompilerServices;
4+
using System.Threading.Tasks;
5+
using UnityEngine.Networking;
6+
7+
namespace {{packageName}}.Client
8+
{
9+
/// <summary>
10+
/// Provides an awaiter for UnityWebRequestAsyncOperation to allow `await request.SendWebRequest()`
11+
/// in Unity async methods. Unity's AsyncOperation types are not awaitable by default, so this
12+
/// extension bridges that gap by converting the operation into a Task.
13+
/// </summary>
14+
public static class UnityWebRequestAwaiterExtensions
15+
{
16+
public static TaskAwaiter<UnityWebRequestAsyncOperation> GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
17+
{
18+
var tcs = new TaskCompletionSource<UnityWebRequestAsyncOperation>();
19+
asyncOp.completed += _ => tcs.SetResult(asyncOp);
20+
return tcs.Task.GetAwaiter();
21+
}
22+
}
23+
}

samples/client/petstore/csharp/unityWebRequest/net9/Petstore/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
137137
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
138138
src/Org.OpenAPITools/Client/RequestOptions.cs
139139
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
140+
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
140141
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
141142
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
142143
src/Org.OpenAPITools/Model/Activity.cs

samples/client/petstore/csharp/unityWebRequest/net9/Petstore/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
1212
<a id="version-support"></a>
1313
## Version support
1414
This generator should support all current LTS versions of Unity
15-
- Unity 2020.3 (LTS) and up
15+
- Unity 2019.4 (LTS) and up
1616
- .NET Standard 2.1 / .NET Framework
1717

1818
<a id="dependencies"></a>

samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs

+22-9
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,9 @@ private async Task<ApiResponse<T>> ExecAsync<T>(
385385

386386
using (request)
387387
{
388-
if (configuration.Timeout > 0)
388+
if (configuration.Timeout > TimeSpan.Zero)
389389
{
390-
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
390+
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
391391
}
392392

393393
if (configuration.Proxy != null)
@@ -408,21 +408,34 @@ private async Task<ApiResponse<T>> ExecAsync<T>(
408408

409409
InterceptRequest(request, path, options, configuration);
410410

411+
#if UNITY_2020_2_OR_NEWER
412+
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
411413
var asyncOp = request.SendWebRequest();
412-
413-
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
414-
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
415-
414+
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
415+
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
416416
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
417417
{
418-
await tsc.Task;
418+
await tcs.Task;
419419
}
420-
420+
421421
if (request.result == UnityWebRequest.Result.ConnectionError ||
422422
request.result == UnityWebRequest.Result.DataProcessingError)
423423
{
424424
throw new ConnectionException(request);
425425
}
426+
#else
427+
// For Unity 2019 and earlier, await the operation directly.
428+
var asyncOp = request.SendWebRequest();
429+
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
430+
{
431+
await asyncOp;
432+
}
433+
434+
if (request.isNetworkError || request.isHttpError)
435+
{
436+
throw new ConnectionException(request);
437+
}
438+
#endif
426439

427440
object responseData = deserializer.Deserialize<T>(request);
428441

@@ -642,4 +655,4 @@ public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableCon
642655
}
643656
#endregion ISynchronousClient
644657
}
645-
}
658+
}

samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs

+36
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
namespace Org.OpenAPITools.Client
1515
{
16+
#if UNITY_2020_1_OR_NEWER
1617
public class ConnectionException : Exception
1718
{
1819
public UnityWebRequest.Result Result { get; private set; }
@@ -26,4 +27,39 @@ public ConnectionException(UnityWebRequest request)
2627
Error = request.error ?? "";
2728
}
2829
}
30+
#else
31+
// For Unity 2019, define a custom enum that roughly simulates UnityWebRequest.Result.
32+
public enum UnityWebRequestResultLegacy
33+
{
34+
Success,
35+
ConnectionError,
36+
ProtocolError,
37+
DataProcessingError
38+
}
39+
40+
public class ConnectionException : Exception
41+
{
42+
public UnityWebRequestResultLegacy Result { get; private set; }
43+
public string Error { get; private set; }
44+
45+
public ConnectionException(UnityWebRequest request)
46+
: base($"Error: {request.error}")
47+
{
48+
if (request.isNetworkError)
49+
{
50+
Result = UnityWebRequestResultLegacy.ConnectionError;
51+
}
52+
else if (request.isHttpError)
53+
{
54+
Result = UnityWebRequestResultLegacy.ProtocolError;
55+
}
56+
else
57+
{
58+
Result = UnityWebRequestResultLegacy.Success;
59+
}
60+
61+
Error = request.error ?? "";
62+
}
63+
}
64+
#endif
2965
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* OpenAPI Petstore
3+
*
4+
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
5+
*
6+
* The version of the OpenAPI document: 1.0.0
7+
* Generated by: https://github.com/openapitools/openapi-generator.git
8+
*/
9+
10+
11+
using System.Runtime.CompilerServices;
12+
using System.Threading.Tasks;
13+
using UnityEngine.Networking;
14+
15+
namespace Org.OpenAPITools.Client
16+
{
17+
/// <summary>
18+
/// Provides an awaiter for UnityWebRequestAsyncOperation to allow `await request.SendWebRequest()`
19+
/// in Unity async methods. Unity's AsyncOperation types are not awaitable by default, so this
20+
/// extension bridges that gap by converting the operation into a Task.
21+
/// </summary>
22+
public static class UnityWebRequestAwaiterExtensions
23+
{
24+
public static TaskAwaiter<UnityWebRequestAsyncOperation> GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
25+
{
26+
var tcs = new TaskCompletionSource<UnityWebRequestAsyncOperation>();
27+
asyncOp.completed += _ => tcs.SetResult(asyncOp);
28+
return tcs.Task.GetAwaiter();
29+
}
30+
}
31+
}

samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/.openapi-generator/FILES

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
137137
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
138138
src/Org.OpenAPITools/Client/RequestOptions.cs
139139
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
140+
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
140141
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
141142
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
142143
src/Org.OpenAPITools/Model/Activity.cs

samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
1212
<a id="version-support"></a>
1313
## Version support
1414
This generator should support all current LTS versions of Unity
15-
- Unity 2020.3 (LTS) and up
15+
- Unity 2019.4 (LTS) and up
1616
- .NET Standard 2.1 / .NET Framework
1717

1818
<a id="dependencies"></a>

samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs

+22-9
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,9 @@ private async Task<ApiResponse<T>> ExecAsync<T>(
385385

386386
using (request)
387387
{
388-
if (configuration.Timeout > 0)
388+
if (configuration.Timeout > TimeSpan.Zero)
389389
{
390-
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
390+
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
391391
}
392392

393393
if (configuration.Proxy != null)
@@ -408,21 +408,34 @@ private async Task<ApiResponse<T>> ExecAsync<T>(
408408

409409
InterceptRequest(request, path, options, configuration);
410410

411+
#if UNITY_2020_2_OR_NEWER
412+
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
411413
var asyncOp = request.SendWebRequest();
412-
413-
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
414-
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
415-
414+
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
415+
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
416416
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
417417
{
418-
await tsc.Task;
418+
await tcs.Task;
419419
}
420-
420+
421421
if (request.result == UnityWebRequest.Result.ConnectionError ||
422422
request.result == UnityWebRequest.Result.DataProcessingError)
423423
{
424424
throw new ConnectionException(request);
425425
}
426+
#else
427+
// For Unity 2019 and earlier, await the operation directly.
428+
var asyncOp = request.SendWebRequest();
429+
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
430+
{
431+
await asyncOp;
432+
}
433+
434+
if (request.isNetworkError || request.isHttpError)
435+
{
436+
throw new ConnectionException(request);
437+
}
438+
#endif
426439

427440
object responseData = deserializer.Deserialize<T>(request);
428441

@@ -642,4 +655,4 @@ public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableCon
642655
}
643656
#endregion ISynchronousClient
644657
}
645-
}
658+
}

0 commit comments

Comments
 (0)