Skip to content

Commit 86eaf97

Browse files
committed
Add unity 2019 and update samples
1 parent 9bac318 commit 86eaf97

File tree

8 files changed

+168
-14
lines changed

8 files changed

+168
-14
lines changed

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

Lines changed: 1 addition & 0 deletions
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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -400,21 +400,34 @@ namespace {{packageName}}.Client
400400

401401
InterceptRequest(request, path, options, configuration);
402402

403+
#if UNITY_2020_2_OR_NEWER
404+
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
403405
var asyncOp = request.SendWebRequest();
404-
405-
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
406-
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
407-
406+
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
407+
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
408408
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
409409
{
410-
await tsc.Task;
410+
await tcs.Task;
411411
}
412-
412+
413413
if (request.result == UnityWebRequest.Result.ConnectionError ||
414414
request.result == UnityWebRequest.Result.DataProcessingError)
415415
{
416416
throw new ConnectionException(request);
417417
}
418+
#else
419+
// For Unity 2019 and earlier, await the operation directly.
420+
var asyncOp = request.SendWebRequest();
421+
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
422+
{
423+
await asyncOp;
424+
}
425+
426+
if (request.isNetworkError || request.isHttpError)
427+
{
428+
throw new ConnectionException(request);
429+
}
430+
#endif
418431

419432
object responseData = deserializer.Deserialize<T>(request);
420433

@@ -636,4 +649,4 @@ namespace {{packageName}}.Client
636649
}
637650
#endregion ISynchronousClient
638651
}
639-
}
652+
}

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

Lines changed: 36 additions & 0 deletions
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
}
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/standard2.0/Petstore/.openapi-generator/FILES

Lines changed: 1 addition & 0 deletions
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/src/Org.OpenAPITools/Client/ApiClient.cs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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/standard2.0/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs

Lines changed: 36 additions & 0 deletions
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+
}

0 commit comments

Comments
 (0)