Skip to content

[feat][csharp][unity] Add unity 2019 support and update samples #21036

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -924,6 +924,7 @@ public void processOpts() {
addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir);
supportingFiles.add(new SupportingFile("ConnectionException.mustache", clientPackageDir, "ConnectionException.cs"));
supportingFiles.add(new SupportingFile("UnexpectedResponseException.mustache", clientPackageDir, "UnexpectedResponseException.cs"));
supportingFiles.add(new SupportingFile("UnityWebRequestAwaiterExtension.mustache", clientPackageDir, "UnityWebRequestAwaiterExtension.cs"));
break;
default: // generichost
addGenericHostSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -377,10 +377,18 @@ namespace {{packageName}}.Client

using (request)
{
{{#useIntForTimeout}}
if (configuration.Timeout > 0)
{
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
request.timeout = configuration.Timeout;
}
{{/useIntForTimeout}}
{{^useIntForTimeout}}
if (configuration.Timeout > TimeSpan.Zero)
{
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
}
{{/useIntForTimeout}}

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

InterceptRequest(request, path, options, configuration);

#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest();

TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tsc.TrySetResult(request.result);

TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await tsc.Task;
await tcs.Task;
}

if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError)
{
throw new ConnectionException(request);
}
#else
// For Unity 2019 and earlier, await the operation directly.
var asyncOp = request.SendWebRequest();
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await asyncOp;
}

if (request.isNetworkError || request.isHttpError)
{
throw new ConnectionException(request);
}
#endif

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

Expand Down Expand Up @@ -636,4 +657,4 @@ namespace {{packageName}}.Client
}
#endregion ISynchronousClient
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ using UnityEngine.Networking;

namespace {{packageName}}.Client
{
#if UNITY_2020_1_OR_NEWER
public class ConnectionException : Exception
{
public UnityWebRequest.Result Result { get; private set; }
Expand All @@ -18,4 +19,39 @@ namespace {{packageName}}.Client
Error = request.error ?? "";
}
}
#else
// For Unity 2019, define a custom enum that roughly simulates UnityWebRequest.Result.
public enum UnityWebRequestResultLegacy
{
Success,
ConnectionError,
ProtocolError,
DataProcessingError
}

public class ConnectionException : Exception
{
public UnityWebRequestResultLegacy Result { get; private set; }
public string Error { get; private set; }

public ConnectionException(UnityWebRequest request)
: base($"Error: {request.error}")
{
if (request.isNetworkError)
{
Result = UnityWebRequestResultLegacy.ConnectionError;
}
else if (request.isHttpError)
{
Result = UnityWebRequestResultLegacy.ProtocolError;
}
else
{
Result = UnityWebRequestResultLegacy.Success;
}

Error = request.error ?? "";
}
}
#endif
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a>
## Version support
This generator should support all current LTS versions of Unity
- Unity 2020.3 (LTS) and up
- Unity 2019.4 (LTS) and up
- .NET Standard 2.1 / .NET Framework

<a id="dependencies"></a>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{{>partial_header}}

using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using UnityEngine.Networking;

namespace {{packageName}}.Client
{
/// <summary>
/// Provides an awaiter for UnityWebRequestAsyncOperation to allow `await request.SendWebRequest()`
/// in Unity async methods. Unity's AsyncOperation types are not awaitable by default, so this
/// extension bridges that gap by converting the operation into a Task.
/// </summary>
public static class UnityWebRequestAwaiterExtensions
{
public static TaskAwaiter<UnityWebRequestAsyncOperation> GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
{
var tcs = new TaskCompletionSource<UnityWebRequestAsyncOperation>();
asyncOp.completed += _ => tcs.SetResult(asyncOp);
return tcs.Task.GetAwaiter();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
src/Org.OpenAPITools/Client/RequestOptions.cs
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
src/Org.OpenAPITools/Model/Activity.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a>
## Version support
This generator should support all current LTS versions of Unity
- Unity 2020.3 (LTS) and up
- Unity 2019.4 (LTS) and up
- .NET Standard 2.1 / .NET Framework

<a id="dependencies"></a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,9 +385,9 @@ private async Task<ApiResponse<T>> ExecAsync<T>(

using (request)
{
if (configuration.Timeout > 0)
if (configuration.Timeout > TimeSpan.Zero)
{
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
}

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

InterceptRequest(request, path, options, configuration);

#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest();

TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tsc.TrySetResult(request.result);

TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await tsc.Task;
await tcs.Task;
}

if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError)
{
throw new ConnectionException(request);
}
#else
// For Unity 2019 and earlier, await the operation directly.
var asyncOp = request.SendWebRequest();
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await asyncOp;
}

if (request.isNetworkError || request.isHttpError)
{
throw new ConnectionException(request);
}
#endif

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

Expand Down Expand Up @@ -642,4 +655,4 @@ public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableCon
}
#endregion ISynchronousClient
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

namespace Org.OpenAPITools.Client
{
#if UNITY_2020_1_OR_NEWER
public class ConnectionException : Exception
{
public UnityWebRequest.Result Result { get; private set; }
Expand All @@ -26,4 +27,39 @@ public ConnectionException(UnityWebRequest request)
Error = request.error ?? "";
}
}
#else
// For Unity 2019, define a custom enum that roughly simulates UnityWebRequest.Result.
public enum UnityWebRequestResultLegacy
{
Success,
ConnectionError,
ProtocolError,
DataProcessingError
}

public class ConnectionException : Exception
{
public UnityWebRequestResultLegacy Result { get; private set; }
public string Error { get; private set; }

public ConnectionException(UnityWebRequest request)
: base($"Error: {request.error}")
{
if (request.isNetworkError)
{
Result = UnityWebRequestResultLegacy.ConnectionError;
}
else if (request.isHttpError)
{
Result = UnityWebRequestResultLegacy.ProtocolError;
}
else
{
Result = UnityWebRequestResultLegacy.Success;
}

Error = request.error ?? "";
}
}
#endif
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* OpenAPI Petstore
*
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
*
* The version of the OpenAPI document: 1.0.0
* Generated by: https://github.com/openapitools/openapi-generator.git
*/


using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using UnityEngine.Networking;

namespace Org.OpenAPITools.Client
{
/// <summary>
/// Provides an awaiter for UnityWebRequestAsyncOperation to allow `await request.SendWebRequest()`
/// in Unity async methods. Unity's AsyncOperation types are not awaitable by default, so this
/// extension bridges that gap by converting the operation into a Task.
/// </summary>
public static class UnityWebRequestAwaiterExtensions
{
public static TaskAwaiter<UnityWebRequestAsyncOperation> GetAwaiter(this UnityWebRequestAsyncOperation asyncOp)
{
var tcs = new TaskCompletionSource<UnityWebRequestAsyncOperation>();
asyncOp.completed += _ => tcs.SetResult(asyncOp);
return tcs.Task.GetAwaiter();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
src/Org.OpenAPITools/Client/RequestOptions.cs
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
src/Org.OpenAPITools/Model/Activity.cs
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a>
## Version support
This generator should support all current LTS versions of Unity
- Unity 2020.3 (LTS) and up
- Unity 2019.4 (LTS) and up
- .NET Standard 2.1 / .NET Framework

<a id="dependencies"></a>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -385,9 +385,9 @@ private async Task<ApiResponse<T>> ExecAsync<T>(

using (request)
{
if (configuration.Timeout > 0)
if (configuration.Timeout > TimeSpan.Zero)
{
request.timeout = (int)Math.Ceiling(configuration.Timeout / 1000.0f);
request.timeout = (int)Math.Ceiling(configuration.Timeout.TotalSeconds);
}

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

InterceptRequest(request, path, options, configuration);

#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest();

TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tsc.TrySetResult(request.result);

TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
asyncOp.completed += (_) => tcs.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await tsc.Task;
await tcs.Task;
}

if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError)
{
throw new ConnectionException(request);
}
#else
// For Unity 2019 and earlier, await the operation directly.
var asyncOp = request.SendWebRequest();
using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{
await asyncOp;
}

if (request.isNetworkError || request.isHttpError)
{
throw new ConnectionException(request);
}
#endif

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

Expand Down Expand Up @@ -642,4 +655,4 @@ public ApiResponse<T> Patch<T>(string path, RequestOptions options, IReadableCon
}
#endregion ISynchronousClient
}
}
}
Loading
Loading