diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java index 4eb82fe1c84..6609a71b295 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CSharpClientCodegen.java @@ -924,6 +924,7 @@ public class CSharpClientCodegen extends AbstractCSharpCodegen { 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); diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ApiClient.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ApiClient.mustache index df7b9d05422..4667625bc6b 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ApiClient.mustache @@ -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) { @@ -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 tsc = new TaskCompletionSource(); - asyncOp.completed += (_) => tsc.TrySetResult(request.result); - + TaskCompletionSource tcs = new TaskCompletionSource(); + 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(request); @@ -636,4 +657,4 @@ namespace {{packageName}}.Client } #endregion ISynchronousClient } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ConnectionException.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ConnectionException.mustache index 108ea3bf567..c4c9ae32e8b 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ConnectionException.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/ConnectionException.mustache @@ -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; } @@ -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 } diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/README.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/README.mustache index b0a140dd6da..e94bc78c600 100644 --- a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/README.mustache +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/README.mustache @@ -20,7 +20,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap ## 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 diff --git a/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/UnityWebRequestAwaiterExtension.mustache b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/UnityWebRequestAwaiterExtension.mustache new file mode 100644 index 00000000000..1f9ff95c469 --- /dev/null +++ b/modules/openapi-generator/src/main/resources/csharp/libraries/unityWebRequest/UnityWebRequestAwaiterExtension.mustache @@ -0,0 +1,23 @@ +{{>partial_header}} + +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using UnityEngine.Networking; + +namespace {{packageName}}.Client +{ + /// + /// 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. + /// + public static class UnityWebRequestAwaiterExtensions + { + public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp) + { + var tcs = new TaskCompletionSource(); + asyncOp.completed += _ => tcs.SetResult(asyncOp); + return tcs.Task.GetAwaiter(); + } + } +} diff --git a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/.openapi-generator/FILES b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/.openapi-generator/FILES index 3e62e8f7541..f91fdecb655 100644 --- a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/.openapi-generator/FILES +++ b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/.openapi-generator/FILES @@ -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 diff --git a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/README.md b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/README.md index aa3a9346608..6afcadef08c 100644 --- a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/README.md +++ b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/README.md @@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap ## 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 diff --git a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs index f6913f2f6b2..4f9c937706b 100644 --- a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs @@ -385,9 +385,9 @@ namespace Org.OpenAPITools.Client 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) @@ -408,21 +408,34 @@ namespace Org.OpenAPITools.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 tsc = new TaskCompletionSource(); - asyncOp.completed += (_) => tsc.TrySetResult(request.result); - + TaskCompletionSource tcs = new TaskCompletionSource(); + 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(request); @@ -642,4 +655,4 @@ namespace Org.OpenAPITools.Client } #endregion ISynchronousClient } -} \ No newline at end of file +} diff --git a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs index 568790e1b12..be271df047d 100644 --- a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs +++ b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs @@ -13,6 +13,7 @@ using UnityEngine.Networking; namespace Org.OpenAPITools.Client { +#if UNITY_2020_1_OR_NEWER public class ConnectionException : Exception { public UnityWebRequest.Result Result { get; private set; } @@ -26,4 +27,39 @@ namespace Org.OpenAPITools.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 } diff --git a/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs new file mode 100644 index 00000000000..073201b0439 --- /dev/null +++ b/samples/client/petstore/csharp/unityWebRequest/net9/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs @@ -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 +{ + /// + /// 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. + /// + public static class UnityWebRequestAwaiterExtensions + { + public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp) + { + var tcs = new TaskCompletionSource(); + asyncOp.completed += _ => tcs.SetResult(asyncOp); + return tcs.Task.GetAwaiter(); + } + } +} diff --git a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/.openapi-generator/FILES b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/.openapi-generator/FILES index 3e62e8f7541..f91fdecb655 100644 --- a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/.openapi-generator/FILES +++ b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/.openapi-generator/FILES @@ -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 diff --git a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/README.md b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/README.md index aa3a9346608..6afcadef08c 100644 --- a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/README.md +++ b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/README.md @@ -12,7 +12,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap ## 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 diff --git a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs index f6913f2f6b2..4f9c937706b 100644 --- a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs +++ b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ApiClient.cs @@ -385,9 +385,9 @@ namespace Org.OpenAPITools.Client 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) @@ -408,21 +408,34 @@ namespace Org.OpenAPITools.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 tsc = new TaskCompletionSource(); - asyncOp.completed += (_) => tsc.TrySetResult(request.result); - + TaskCompletionSource tcs = new TaskCompletionSource(); + 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(request); @@ -642,4 +655,4 @@ namespace Org.OpenAPITools.Client } #endregion ISynchronousClient } -} \ No newline at end of file +} diff --git a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs index 568790e1b12..be271df047d 100644 --- a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs +++ b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/ConnectionException.cs @@ -13,6 +13,7 @@ using UnityEngine.Networking; namespace Org.OpenAPITools.Client { +#if UNITY_2020_1_OR_NEWER public class ConnectionException : Exception { public UnityWebRequest.Result Result { get; private set; } @@ -26,4 +27,39 @@ namespace Org.OpenAPITools.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 } diff --git a/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs new file mode 100644 index 00000000000..073201b0439 --- /dev/null +++ b/samples/client/petstore/csharp/unityWebRequest/standard2.0/Petstore/src/Org.OpenAPITools/Client/UnityWebRequestAwaiterExtension.cs @@ -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 +{ + /// + /// 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. + /// + public static class UnityWebRequestAwaiterExtensions + { + public static TaskAwaiter GetAwaiter(this UnityWebRequestAsyncOperation asyncOp) + { + var tcs = new TaskCompletionSource(); + asyncOp.completed += _ => tcs.SetResult(asyncOp); + return tcs.Task.GetAwaiter(); + } + } +}