Add unity 2019 support and update samples (#21036)

This commit is contained in:
Tobias 2025-04-06 13:02:14 -04:00 committed by GitHub
parent 6b13ad522f
commit 047ceeaa45
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 272 additions and 29 deletions

View File

@ -924,6 +924,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen {
addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir); addSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir, authPackageDir);
supportingFiles.add(new SupportingFile("ConnectionException.mustache", clientPackageDir, "ConnectionException.cs")); supportingFiles.add(new SupportingFile("ConnectionException.mustache", clientPackageDir, "ConnectionException.cs"));
supportingFiles.add(new SupportingFile("UnexpectedResponseException.mustache", clientPackageDir, "UnexpectedResponseException.cs")); supportingFiles.add(new SupportingFile("UnexpectedResponseException.mustache", clientPackageDir, "UnexpectedResponseException.cs"));
supportingFiles.add(new SupportingFile("UnityWebRequestAwaiterExtension.mustache", clientPackageDir, "UnityWebRequestAwaiterExtension.cs"));
break; break;
default: // generichost default: // generichost
addGenericHostSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir); addGenericHostSupportingFiles(clientPackageDir, packageFolder, excludeTests, testPackageFolder, testPackageName, modelPackageDir);

View File

@ -377,10 +377,18 @@ namespace {{packageName}}.Client
using (request) using (request)
{ {
{{#useIntForTimeout}}
if (configuration.Timeout > 0) 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) if (configuration.Proxy != null)
{ {
@ -400,21 +408,34 @@ namespace {{packageName}}.Client
InterceptRequest(request, path, options, configuration); InterceptRequest(request, path, options, configuration);
#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest(); var asyncOp = request.SendWebRequest();
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>(); asyncOp.completed += (_) => tcs.TrySetResult(request.result);
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true)) using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{ {
await tsc.Task; await tcs.Task;
} }
if (request.result == UnityWebRequest.Result.ConnectionError || if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError) request.result == UnityWebRequest.Result.DataProcessingError)
{ {
throw new ConnectionException(request); 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); object responseData = deserializer.Deserialize<T>(request);
@ -636,4 +657,4 @@ namespace {{packageName}}.Client
} }
#endregion ISynchronousClient #endregion ISynchronousClient
} }
} }

View File

@ -5,6 +5,7 @@ using UnityEngine.Networking;
namespace {{packageName}}.Client namespace {{packageName}}.Client
{ {
#if UNITY_2020_1_OR_NEWER
public class ConnectionException : Exception public class ConnectionException : Exception
{ {
public UnityWebRequest.Result Result { get; private set; } public UnityWebRequest.Result Result { get; private set; }
@ -18,4 +19,39 @@ namespace {{packageName}}.Client
Error = request.error ?? ""; 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
} }

View File

@ -20,7 +20,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a> <a id="version-support"></a>
## Version support ## Version support
This generator should support all current LTS versions of Unity 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 - .NET Standard 2.1 / .NET Framework
<a id="dependencies"></a> <a id="dependencies"></a>

View File

@ -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();
}
}
}

View File

@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
src/Org.OpenAPITools/Client/RequestOptions.cs src/Org.OpenAPITools/Client/RequestOptions.cs
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
src/Org.OpenAPITools/Model/Activity.cs src/Org.OpenAPITools/Model/Activity.cs

View File

@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a> <a id="version-support"></a>
## Version support ## Version support
This generator should support all current LTS versions of Unity 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 - .NET Standard 2.1 / .NET Framework
<a id="dependencies"></a> <a id="dependencies"></a>

View File

@ -385,9 +385,9 @@ namespace Org.OpenAPITools.Client
using (request) 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) if (configuration.Proxy != null)
@ -408,21 +408,34 @@ namespace Org.OpenAPITools.Client
InterceptRequest(request, path, options, configuration); InterceptRequest(request, path, options, configuration);
#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest(); var asyncOp = request.SendWebRequest();
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>(); asyncOp.completed += (_) => tcs.TrySetResult(request.result);
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true)) using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{ {
await tsc.Task; await tcs.Task;
} }
if (request.result == UnityWebRequest.Result.ConnectionError || if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError) request.result == UnityWebRequest.Result.DataProcessingError)
{ {
throw new ConnectionException(request); 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); object responseData = deserializer.Deserialize<T>(request);
@ -642,4 +655,4 @@ namespace Org.OpenAPITools.Client
} }
#endregion ISynchronousClient #endregion ISynchronousClient
} }
} }

View File

@ -13,6 +13,7 @@ using UnityEngine.Networking;
namespace Org.OpenAPITools.Client namespace Org.OpenAPITools.Client
{ {
#if UNITY_2020_1_OR_NEWER
public class ConnectionException : Exception public class ConnectionException : Exception
{ {
public UnityWebRequest.Result Result { get; private set; } public UnityWebRequest.Result Result { get; private set; }
@ -26,4 +27,39 @@ namespace Org.OpenAPITools.Client
Error = request.error ?? ""; 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
} }

View File

@ -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();
}
}
}

View File

@ -137,6 +137,7 @@ src/Org.OpenAPITools/Client/Multimap.cs
src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs src/Org.OpenAPITools/Client/OpenAPIDateConverter.cs
src/Org.OpenAPITools/Client/RequestOptions.cs src/Org.OpenAPITools/Client/RequestOptions.cs
src/Org.OpenAPITools/Client/UnexpectedResponseException.cs src/Org.OpenAPITools/Client/UnexpectedResponseException.cs
src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs
src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs src/Org.OpenAPITools/Client/WebRequestPathBuilder.cs
src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs src/Org.OpenAPITools/Model/AbstractOpenAPISchema.cs
src/Org.OpenAPITools/Model/Activity.cs src/Org.OpenAPITools/Model/Activity.cs

View File

@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
<a id="version-support"></a> <a id="version-support"></a>
## Version support ## Version support
This generator should support all current LTS versions of Unity 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 - .NET Standard 2.1 / .NET Framework
<a id="dependencies"></a> <a id="dependencies"></a>

View File

@ -385,9 +385,9 @@ namespace Org.OpenAPITools.Client
using (request) 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) if (configuration.Proxy != null)
@ -408,21 +408,34 @@ namespace Org.OpenAPITools.Client
InterceptRequest(request, path, options, configuration); InterceptRequest(request, path, options, configuration);
#if UNITY_2020_2_OR_NEWER
// For Unity 2020.2 and newer, use UnityWebRequest.Result.
var asyncOp = request.SendWebRequest(); var asyncOp = request.SendWebRequest();
TaskCompletionSource<UnityWebRequest.Result> tcs = new TaskCompletionSource<UnityWebRequest.Result>();
TaskCompletionSource<UnityWebRequest.Result> tsc = new TaskCompletionSource<UnityWebRequest.Result>(); asyncOp.completed += (_) => tcs.TrySetResult(request.result);
asyncOp.completed += (_) => tsc.TrySetResult(request.result);
using (var tokenRegistration = cancellationToken.Register(request.Abort, true)) using (var tokenRegistration = cancellationToken.Register(request.Abort, true))
{ {
await tsc.Task; await tcs.Task;
} }
if (request.result == UnityWebRequest.Result.ConnectionError || if (request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.DataProcessingError) request.result == UnityWebRequest.Result.DataProcessingError)
{ {
throw new ConnectionException(request); 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); object responseData = deserializer.Deserialize<T>(request);
@ -642,4 +655,4 @@ namespace Org.OpenAPITools.Client
} }
#endregion ISynchronousClient #endregion ISynchronousClient
} }
} }

View File

@ -13,6 +13,7 @@ using UnityEngine.Networking;
namespace Org.OpenAPITools.Client namespace Org.OpenAPITools.Client
{ {
#if UNITY_2020_1_OR_NEWER
public class ConnectionException : Exception public class ConnectionException : Exception
{ {
public UnityWebRequest.Result Result { get; private set; } public UnityWebRequest.Result Result { get; private set; }
@ -26,4 +27,39 @@ namespace Org.OpenAPITools.Client
Error = request.error ?? ""; 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
} }

View File

@ -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();
}
}
}