mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2026-01-26 19:30:50 +00:00
Compare commits
56 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
39a3bfa181 | ||
|
|
8cd3ea2457 | ||
|
|
a4985cad28 | ||
|
|
422e30a3d9 | ||
|
|
67cbfb3cad | ||
|
|
0d10a5b8ff | ||
|
|
43b15fbc25 | ||
|
|
695f7076bf | ||
|
|
51d5310dae | ||
|
|
2d81b01737 | ||
|
|
a0dc0e2eb8 | ||
|
|
d19f0cd348 | ||
|
|
17b77909d9 | ||
|
|
852a6075b2 | ||
|
|
1f4017a33f | ||
|
|
2d53488404 | ||
|
|
5926c3175e | ||
|
|
761cb777f6 | ||
|
|
e868637587 | ||
|
|
ea6f4c8780 | ||
|
|
ab42a1bef2 | ||
|
|
943b80bbb4 | ||
|
|
6ad16aaf7b | ||
|
|
db7d39f622 | ||
|
|
acb80bac95 | ||
|
|
b15636e3e9 | ||
|
|
8a3507cfa7 | ||
|
|
2707e5101c | ||
|
|
cc045ab53c | ||
|
|
29befb95d2 | ||
|
|
3f9465edcb | ||
|
|
2c463d9167 | ||
|
|
5cffc45428 | ||
|
|
6fc64e2115 | ||
|
|
a1c948df9f | ||
|
|
bf5ced7354 | ||
|
|
a045531ca7 | ||
|
|
b66c93a864 | ||
|
|
ea0504b17e | ||
|
|
f2a49b1c27 | ||
|
|
c189e5c263 | ||
|
|
0f23c4ff17 | ||
|
|
342febde58 | ||
|
|
4034201640 | ||
|
|
4a61a4ca74 | ||
|
|
b862290aec | ||
|
|
52d910be41 | ||
|
|
3a670a697a | ||
|
|
0f136af41d | ||
|
|
32d4085105 | ||
|
|
3be911d0e6 | ||
|
|
c34d593d8f | ||
|
|
9a0d711cf6 | ||
|
|
9adfe986a3 | ||
|
|
084a0a46b4 | ||
|
|
a62ed1dd2a |
2
.github/workflows/mill-plugin-tests.yaml
vendored
2
.github/workflows/mill-plugin-tests.yaml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
distribution: 'temurin'
|
||||
- name: Restore cache (read-only)
|
||||
# only use restore keys, no save key because we need to clear the cache before running the examples
|
||||
uses: actions/cache/restore@v4
|
||||
uses: actions/cache/restore@v5
|
||||
with:
|
||||
path: |
|
||||
~/.m2/repository
|
||||
|
||||
18
README.md
18
README.md
@@ -15,7 +15,7 @@
|
||||
|
||||
<div align="center">
|
||||
|
||||
[Master](https://github.com/OpenAPITools/openapi-generator/tree/master) (`7.19.0`):
|
||||
[Master](https://github.com/OpenAPITools/openapi-generator/tree/master) (`7.20.0`):
|
||||
[](https://circleci.com/gh/OpenAPITools/openapi-generator)
|
||||
[](https://app.bitrise.io/app/4a2b10a819d12b67)
|
||||
|
||||
@@ -148,8 +148,8 @@ The OpenAPI Specification has undergone 3 revisions since initial creation in 20
|
||||
|
||||
| OpenAPI Generator Version | Release Date | Notes |
|
||||
| --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------- |
|
||||
| 7.19.0 (upcoming minor release) [SNAPSHOT](https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-to-test-with-the-latest-master-of-openapi-generator) | 22.01.2026 | Minor release with breaking changes (with fallback) |
|
||||
| [7.18.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v7.18.0) (latest stable release) | 22.12.2025 | Minor release with breaking changes (with fallback) |
|
||||
| 7.20.0 (upcoming minor release) [SNAPSHOT](https://github.com/OpenAPITools/openapi-generator/wiki/FAQ#how-to-test-with-the-latest-master-of-openapi-generator) | 20.02.2026 | Minor release with breaking changes (with fallback) |
|
||||
| [7.19.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v7.19.0) (latest stable release) | 20.01.2026 | Minor release with breaking changes (with fallback) |
|
||||
| [6.6.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v6.6.0) | 11.05.2023 | Minor release with breaking changes (with fallback) |
|
||||
| [5.4.0](https://github.com/OpenAPITools/openapi-generator/releases/tag/v5.4.0) | 31.01.2022 | Minor release with breaking changes (with fallback) |
|
||||
| [4.3.1](https://github.com/OpenAPITools/openapi-generator/releases/tag/v4.3.1) | 06.05.2020 | Patch release (enhancements, bug fixes, etc) |
|
||||
@@ -212,16 +212,16 @@ See the different versions of the [openapi-generator-cli](https://search.maven.o
|
||||
<!-- RELEASE_VERSION -->
|
||||
If you're looking for the latest stable version, you can grab it directly from Maven.org (Java 11 runtime at a minimum):
|
||||
|
||||
JAR location: `https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.18.0/openapi-generator-cli-7.18.0.jar`
|
||||
JAR location: `https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar`
|
||||
|
||||
For **Mac/Linux** users:
|
||||
```sh
|
||||
wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.18.0/openapi-generator-cli-7.18.0.jar -O openapi-generator-cli.jar
|
||||
wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar -O openapi-generator-cli.jar
|
||||
```
|
||||
|
||||
For **Windows** users, you will need to install [wget](http://gnuwin32.sourceforge.net/packages/wget.htm) or you can use Invoke-WebRequest in PowerShell (3.0+), e.g.
|
||||
```
|
||||
Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.18.0/openapi-generator-cli-7.18.0.jar
|
||||
Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar
|
||||
```
|
||||
|
||||
After downloading the JAR, run `java -jar openapi-generator-cli.jar help` to show the usage.
|
||||
@@ -456,7 +456,7 @@ openapi-generator-cli version
|
||||
To use a specific version of "openapi-generator-cli"
|
||||
|
||||
```sh
|
||||
openapi-generator-cli version-manager set 7.18.0
|
||||
openapi-generator-cli version-manager set 7.19.0
|
||||
```
|
||||
|
||||
Or install it as dev-dependency:
|
||||
@@ -480,7 +480,7 @@ pip install openapi-generator-cli
|
||||
|
||||
To install a specific version
|
||||
```
|
||||
pip install openapi-generator-cli==7.18.0
|
||||
pip install openapi-generator-cli==7.19.0
|
||||
```
|
||||
|
||||
You can also install with [jdk4py](https://github.com/activeviam/jdk4py) instead of java binary. (python>=3.10 is required)
|
||||
@@ -506,7 +506,7 @@ java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar generat
|
||||
(if you're on Windows, replace the last command with `java -jar modules\openapi-generator-cli\target\openapi-generator-cli.jar generate -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/3_0/petstore.yaml -g php -o c:\temp\php_api_client`)
|
||||
|
||||
<!-- RELEASE_VERSION -->
|
||||
You can also download the JAR (latest release) directly from [maven.org](https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.18.0/openapi-generator-cli-7.18.0.jar)
|
||||
You can also download the JAR (latest release) directly from [maven.org](https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar)
|
||||
<!-- /RELEASE_VERSION -->
|
||||
|
||||
To get a list of **general** options available, please run `java -jar modules/openapi-generator-cli/target/openapi-generator-cli.jar help generate`
|
||||
|
||||
6
bin/configs/html.yaml
Normal file
6
bin/configs/html.yaml
Normal file
@@ -0,0 +1,6 @@
|
||||
generatorName: html
|
||||
outputDir: samples/documentation/html
|
||||
inputSpec: modules/openapi-generator/src/test/resources/3_0/petstore.yaml
|
||||
templateDir: modules/openapi-generator/src/main/resources/htmlDocs
|
||||
additionalProperties:
|
||||
hideGenerationTimestamp: "true"
|
||||
@@ -7,6 +7,6 @@ generateAliasAsModel: true
|
||||
additionalProperties:
|
||||
projectName: PetstoreClient
|
||||
useSPMFileStructure: true
|
||||
useClasses: true
|
||||
useClasses: false
|
||||
useBacktickEscapes: true
|
||||
mapFileBinaryToData: true
|
||||
|
||||
@@ -47,26 +47,26 @@ For example:
|
||||
|
||||
echo "$header"
|
||||
|
||||
if [[ ${#files[@]} -eq 1 && "${files[0]}" != *'*'* ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
# shellcheck disable=SC2068
|
||||
java ${JAVA_OPTS} -jar "$executable" generate -c ${files[0]} ${args[@]}
|
||||
else
|
||||
echo "Please press CTRL+C to stop or the script will continue in 5 seconds."
|
||||
#sleep 5
|
||||
if [ ${#files[@]} -eq 0 ]; then
|
||||
files=("${root}"/bin/configs/*.yaml)
|
||||
fi
|
||||
tmpfile=$(mktemp)
|
||||
trap "rm -f $tmpfile" EXIT
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# shellcheck disable=SC2068
|
||||
if java ${JAVA_OPTS} -jar "$executable" batch ${BATCH_OPTS} --includes-base-dir "${root}" --fail-fast -- ${files[@]} 2>&1 | tee /dev/pts/0 | grep -q -i "exception"; then
|
||||
echo "Found exception(s) when running the generator(s) to update the samples."
|
||||
export GENERATE_ERROR=1
|
||||
fi
|
||||
if [[ ${#files[@]} -eq 1 && "${files[0]}" != *'*'* ]]; then
|
||||
# shellcheck disable=SC2086
|
||||
# shellcheck disable=SC2068
|
||||
java ${JAVA_OPTS} -jar "$executable" generate -c ${files[0]} ${args[@]} 2>&1 | tee "$tmpfile"
|
||||
retcode=${PIPESTATUS[0]}
|
||||
else
|
||||
if [ ${#files[@]} -eq 0 ]; then
|
||||
files=("${root}"/bin/configs/*.yaml)
|
||||
fi
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
# shellcheck disable=SC2068
|
||||
java ${JAVA_OPTS} -jar "$executable" batch ${BATCH_OPTS} --includes-base-dir "${root}" --fail-fast -- ${files[@]} 2>&1 | tee "$tmpfile"
|
||||
retcode=${PIPESTATUS[0]}
|
||||
fi
|
||||
|
||||
if [[ -n "$GENERATE_ERROR" ]]; then
|
||||
if [[ $retcode -ne 0 ]] || grep -q -i "at org.openapitools" "$tmpfile"; then
|
||||
echo "Found exception(s) when running the generator(s) to update the samples."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
@@ -27,15 +27,6 @@ workflows:
|
||||
set -e
|
||||
|
||||
./samples/client/petstore/swift6/swift6_test_all.sh
|
||||
- script@1.2.0:
|
||||
title: Run Swift5 tests
|
||||
inputs:
|
||||
- content: |
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
./samples/client/petstore/swift5/swift5_test_all.sh
|
||||
- script@1.2.0:
|
||||
title: Run swift-combine tests
|
||||
inputs:
|
||||
|
||||
@@ -68,7 +68,7 @@ The following generators are available:
|
||||
* [scala-sttp4-jsoniter (beta)](generators/scala-sttp4-jsoniter.md)
|
||||
* [scalaz](generators/scalaz.md)
|
||||
* [swift-combine](generators/swift-combine.md)
|
||||
* [swift5](generators/swift5.md)
|
||||
* [swift5 (deprecated)](generators/swift5.md)
|
||||
* [swift6](generators/swift6.md)
|
||||
* [typescript (experimental)](generators/typescript.md)
|
||||
* [typescript-angular](generators/typescript-angular.md)
|
||||
|
||||
@@ -7,7 +7,7 @@ title: Documentation for the swift5 Generator
|
||||
| Property | Value | Notes |
|
||||
| -------- | ----- | ----- |
|
||||
| generator name | swift5 | pass this to the generate command after -g |
|
||||
| generator stability | STABLE | |
|
||||
| generator stability | DEPRECATED | |
|
||||
| generator type | CLIENT | |
|
||||
| generator language | Swift | |
|
||||
| generator default templating engine | mustache | |
|
||||
|
||||
@@ -22,7 +22,7 @@ npm install @openapitools/openapi-generator-cli -g
|
||||
To install a specific version of the tool, pass the version during installation:
|
||||
<!-- RELEASE_VERSION -->
|
||||
```bash
|
||||
openapi-generator-cli version-manager set 7.17.0
|
||||
openapi-generator-cli version-manager set 7.19.0
|
||||
```
|
||||
<!-- /RELEASE_VERSION -->
|
||||
To install the tool as a dev dependency in your current project:
|
||||
@@ -119,18 +119,18 @@ docker run --rm \
|
||||
<!-- RELEASE_VERSION -->
|
||||
If you're looking for the latest stable version, you can grab it directly from Maven.org (Java 11 runtime at a minimum):
|
||||
|
||||
JAR location: `https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.17.0/openapi-generator-cli-7.17.0.jar`
|
||||
JAR location: `https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar`
|
||||
|
||||
For **Mac/Linux** users:
|
||||
|
||||
```bash
|
||||
wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.17.0/openapi-generator-cli-7.17.0.jar -O openapi-generator-cli.jar
|
||||
wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar -O openapi-generator-cli.jar
|
||||
```
|
||||
|
||||
For **Windows** users, you will need to install [wget](http://gnuwin32.sourceforge.net/packages/wget.htm) or you can use Invoke-WebRequest in PowerShell (3.0+), e.g.
|
||||
|
||||
```powershell
|
||||
Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.17.0/openapi-generator-cli-7.17.0.jar
|
||||
Invoke-WebRequest -OutFile openapi-generator-cli.jar https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.19.0/openapi-generator-cli-7.19.0.jar
|
||||
```
|
||||
<!-- /RELEASE_VERSION -->
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ Add to your `build->plugins` section (default phase is `generate-sources` phase)
|
||||
<plugin>
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<version>7.17.0</version>
|
||||
<version>7.19.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<goals>
|
||||
@@ -130,7 +130,7 @@ This Mill library provides a Mill module that can be used to generate code from
|
||||
```scala
|
||||
//| mill-version: 1.0.6
|
||||
//| mvnDeps:
|
||||
//| - org.openapitools:openapi-generator-mill-plugin:7.19.0 # 1.
|
||||
//| - org.openapitools:openapi-generator-mill-plugin:7.20.0 # 1.
|
||||
|
||||
import mill.*
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<groupId>org.openapitools</groupId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -97,7 +97,7 @@ task validateGoodSpec(type: org.openapitools.generator.gradle.plugin.tasks.Valid
|
||||
[source,group]
|
||||
----
|
||||
plugins {
|
||||
id "org.openapi.generator" version "7.17.0"
|
||||
id "org.openapi.generator" version "7.19.0"
|
||||
}
|
||||
----
|
||||
|
||||
@@ -113,7 +113,7 @@ buildscript {
|
||||
// url "https://plugins.gradle.org/m2/"
|
||||
}
|
||||
dependencies {
|
||||
classpath "org.openapitools:openapi-generator-gradle-plugin:7.17.0"
|
||||
classpath "org.openapitools:openapi-generator-gradle-plugin:7.19.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -759,7 +759,7 @@ buildscript {
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
||||
classpath('org.openapitools:openapi-generator-gradle-plugin:7.17.0') {
|
||||
classpath('org.openapitools:openapi-generator-gradle-plugin:7.19.0') {
|
||||
exclude group: 'com.google.guava'
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# RELEASE_VERSION
|
||||
openApiGeneratorVersion=7.19.0
|
||||
openApiGeneratorVersion=7.20.0-SNAPSHOT
|
||||
# /RELEASE_VERSION
|
||||
|
||||
# BEGIN placeholders
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# RELEASE_VERSION
|
||||
openApiGeneratorVersion=7.19.0
|
||||
openApiGeneratorVersion=7.20.0-SNAPSHOT
|
||||
# /RELEASE_VERSION
|
||||
|
||||
@@ -12,7 +12,7 @@ Add to your `build->plugins` section (default phase is `generate-sources` phase)
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.17.0</version>
|
||||
<version>7.19.0</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<dependencies>
|
||||
<dependency>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-maven-plugin</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<executions>
|
||||
<execution>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# RELEASE_VERSION
|
||||
openApiGeneratorVersion=7.19.0
|
||||
openApiGeneratorVersion=7.20.0-SNAPSHOT
|
||||
# /RELEASE_VERSION
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
@@ -139,6 +139,28 @@
|
||||
<goal>testCompile</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
<execution>
|
||||
<!-- see https://github.com/davidB/scala-maven-plugin/issues/604 why a workaround is needed -->
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>doc-jar</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<scaladocClassName>dotty.tools.scaladoc.Main</scaladocClassName>
|
||||
<sourceDir>${project.build.outputDirectory}</sourceDir>
|
||||
<args>-nobootcp</args>
|
||||
<includes>
|
||||
<include>**/*.tasty</include>
|
||||
</includes>
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.scala-lang</groupId>
|
||||
<artifactId>scaladoc_3</artifactId>
|
||||
<version>3.7.4</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<groupId>org.openapitools</groupId>
|
||||
<artifactId>openapi-generator-project</artifactId>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<relativePath>../../pom.xml</relativePath>
|
||||
</parent>
|
||||
|
||||
@@ -1854,7 +1854,7 @@ public class OpenAPINormalizer {
|
||||
schema.addAnyOfItem(new BooleanSchema());
|
||||
break;
|
||||
default:
|
||||
LOGGER.error("Type {} not yet supported in openapi-normalizer to process OpenAPI 3.1 spec with multiple types.");
|
||||
LOGGER.error("Type {} not yet supported in openapi-normalizer to process OpenAPI 3.1 spec with multiple types.", String.valueOf(type));
|
||||
LOGGER.error("Please report the issue via https://github.com/OpenAPITools/openapi-generator/issues/new/.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -134,7 +134,7 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
this.useOneOfInterfaces = true;
|
||||
|
||||
generatorMetadata = GeneratorMetadata.newBuilder(generatorMetadata)
|
||||
.stability(Stability.STABLE)
|
||||
.stability(Stability.DEPRECATED)
|
||||
.build();
|
||||
|
||||
outputFolder = "generated-code" + File.separator + "swift";
|
||||
@@ -430,6 +430,8 @@ public class Swift5ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
public void processOpts() {
|
||||
super.processOpts();
|
||||
|
||||
LOGGER.warn("IMPORTANT: This generator has been deprecated. Please use `swift6` instead");
|
||||
|
||||
if (StringUtils.isEmpty(System.getenv("SWIFT_POST_PROCESS_FILE"))) {
|
||||
LOGGER.info("Environment variable SWIFT_POST_PROCESS_FILE not defined so the Swift code may not be properly formatted. To define it, try 'export SWIFT_POST_PROCESS_FILE=/usr/local/bin/swiftformat' (Linux/Mac)");
|
||||
LOGGER.info("NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI).");
|
||||
|
||||
@@ -491,6 +491,9 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
|
||||
additionalProperties.put(RESPONSE_AS, responseAs);
|
||||
if (ArrayUtils.contains(responseAs, RESPONSE_LIBRARY_PROMISE_KIT)) {
|
||||
additionalProperties.put("usePromiseKit", true);
|
||||
LOGGER.warn("NOTICE: We are considering deprecating PromiseKit support in the Swift 6 generator. " +
|
||||
"If you are still using it, please share your use case here: " +
|
||||
"https://github.com/OpenAPITools/openapi-generator/issues/22791");
|
||||
}
|
||||
if (ArrayUtils.contains(responseAs, RESPONSE_LIBRARY_RX_SWIFT)) {
|
||||
additionalProperties.put("useRxSwift", true);
|
||||
|
||||
@@ -235,7 +235,7 @@ public class URLPathUtils {
|
||||
public static boolean isRelativeUrl(List<Server> servers) {
|
||||
if (servers != null && servers.size() > 0) {
|
||||
final Server firstServer = servers.get(0);
|
||||
return Pattern.matches("^(\\/[\\w\\d]+)+", firstServer.getUrl());
|
||||
return Pattern.matches("^(\\/[\\w\\d.~@-]+)+", firstServer.getUrl());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ for this project used jakarta.validation-api -->
|
||||
<swagger-core-version>1.5.22</swagger-core-version>
|
||||
<jetty-version>9.2.9.v20150224</jetty-version>
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
{{#useBeanValidation}}
|
||||
<beanvalidation-version>2.0.2</beanvalidation-version>
|
||||
{{/useBeanValidation}}
|
||||
|
||||
@@ -342,7 +342,7 @@ for this project used jakarta.validation-api -->
|
||||
{{/generateSpringApplication}}
|
||||
{{^generateSpringBootApplication}}
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
{{/generateSpringBootApplication}}
|
||||
<cxf-version>3.5.9</cxf-version>
|
||||
<jackson-jaxrs-version>2.17.1</jackson-jaxrs-version>
|
||||
|
||||
@@ -255,7 +255,7 @@ for this project used jakarta.validation-api -->
|
||||
{{/swagger2AnnotationLibrary}}
|
||||
<jetty-version>9.2.9.v20150224</jetty-version>
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
{{#useBeanValidation}}
|
||||
<beanvalidation-version>2.0.2</beanvalidation-version>
|
||||
{{/useBeanValidation}}
|
||||
|
||||
@@ -311,7 +311,7 @@ for this project used jakarta.validation-api -->
|
||||
{{/swagger2AnnotationLibrary}}
|
||||
<jetty-version>9.2.9.v20150224</jetty-version>
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
{{#useBeanValidation}}
|
||||
<beanvalidation-version>2.0.2</beanvalidation-version>
|
||||
{{/useBeanValidation}}
|
||||
|
||||
@@ -222,7 +222,7 @@
|
||||
<jersey3-version>3.1.3</jersey3-version>
|
||||
<jackson-version>2.17.1</jackson-version>
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
<servlet-api-version>5.0.0</servlet-api-version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
@@ -222,7 +222,7 @@ for this project used jakarta.validation-api -->
|
||||
<jersey2-version>2.35</jersey2-version>
|
||||
<jackson-version>2.17.1</jackson-version>
|
||||
<junit-version>4.13.2</junit-version>
|
||||
<logback-version>1.5.19</logback-version>
|
||||
<logback-version>1.5.25</logback-version>
|
||||
<servlet-api-version>4.0.4</servlet-api-version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
@@ -133,6 +133,13 @@ If your endpoint has multiple server objects in the servers array, you can set t
|
||||
void setServerIndex(const QString &operation, int serverIndex);
|
||||
```
|
||||
Parameter "operation" should be your operationid. "serverIndex" is the index you want to set as your default server. The function will check if there is a server with your index.
|
||||
|
||||
Alternatively, to set the server index globally for all operations:
|
||||
```c++
|
||||
void setServerIndex(int serverIndex);
|
||||
```
|
||||
This will apply the specified server index to all operations in the API.
|
||||
|
||||
Here is an example of multiple servers in the servers array. The first server will have index 0 and the second will have index 1.
|
||||
```yaml
|
||||
servers:
|
||||
|
||||
@@ -57,9 +57,9 @@ void {{classname}}::initializeServerConfigs() {
|
||||
}
|
||||
|
||||
/**
|
||||
* returns 0 on success and -1, -2 or -3 on failure.
|
||||
* -1 when the variable does not exist and -2 if the value is not defined in the enum and -3 if the operation or server index is not found
|
||||
*/
|
||||
* returns 0 on success and -1, -2 or -3 on failure.
|
||||
* -1 when the variable does not exist and -2 if the value is not defined in the enum and -3 if the operation or server index is not found
|
||||
*/
|
||||
int {{classname}}::setDefaultServerValue(int serverIndex, const QString &operation, const QString &variable, const QString &value) {
|
||||
auto it = _serverConfigs.find(operation);
|
||||
if (it != _serverConfigs.end() && serverIndex < it.value().size()) {
|
||||
@@ -67,12 +67,24 @@ int {{classname}}::setDefaultServerValue(int serverIndex, const QString &operati
|
||||
}
|
||||
return -3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the server index.
|
||||
* @param operation The id to the target operation.
|
||||
* @param serverIndex The server index.
|
||||
*/
|
||||
void {{classname}}::setServerIndex(const QString &operation, int serverIndex) {
|
||||
if (_serverIndices.contains(operation) && serverIndex < _serverConfigs.find(operation).value().size()) {
|
||||
_serverIndices[operation] = serverIndex;
|
||||
}
|
||||
}
|
||||
|
||||
void {{classname}}::setServerIndex(int serverIndex) {
|
||||
for (auto keyIt = _serverIndices.keyBegin(); keyIt != _serverIndices.keyEnd(); keyIt++) {
|
||||
setServerIndex(*keyIt, serverIndex);
|
||||
}
|
||||
}
|
||||
|
||||
void {{classname}}::setApiKey(const QString &apiKeyName, const QString &apiKey) {
|
||||
_apiKeys.insert(apiKeyName, apiKey);
|
||||
}
|
||||
@@ -103,13 +115,13 @@ void {{classname}}::setNetworkAccessManager(QNetworkAccessManager* manager) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a new ServerConfiguration to the config map for a specific operation.
|
||||
* @param operation The id to the target operation.
|
||||
* @param url A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
* returns the index of the new server config on success and -1 if the operation is not found
|
||||
*/
|
||||
* Appends a new ServerConfiguration to the config map for a specific operation.
|
||||
* @param operation The id to the target operation.
|
||||
* @param url A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
* returns the index of the new server config on success and -1 if the operation is not found
|
||||
*/
|
||||
int {{classname}}::addServerConfiguration(const QString &operation, const QUrl &url, const QString &description, const QMap<QString, {{prefix}}ServerVariable> &variables) {
|
||||
if (_serverConfigs.contains(operation)) {
|
||||
_serverConfigs[operation].append({{prefix}}ServerConfiguration(
|
||||
@@ -123,11 +135,11 @@ int {{classname}}::addServerConfiguration(const QString &operation, const QUrl &
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a new ServerConfiguration to the config map for a all operations and sets the index to that server.
|
||||
* @param url A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
*/
|
||||
* Appends a new ServerConfiguration to the config map for a all operations and sets the index to that server.
|
||||
* @param url A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
*/
|
||||
void {{classname}}::setNewServerForAllOperations(const QUrl &url, const QString &description, const QMap<QString, {{prefix}}ServerVariable> &variables) {
|
||||
for (auto keyIt = _serverIndices.keyBegin(); keyIt != _serverIndices.keyEnd(); keyIt++) {
|
||||
setServerIndex(*keyIt, addServerConfiguration(*keyIt, url, description, variables));
|
||||
@@ -135,11 +147,11 @@ void {{classname}}::setNewServerForAllOperations(const QUrl &url, const QString
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a new ServerConfiguration to the config map for an operations and sets the index to that server.
|
||||
* @param URL A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
*/
|
||||
* Appends a new ServerConfiguration to the config map for an operations and sets the index to that server.
|
||||
* @param URL A string that contains the URL of the server
|
||||
* @param description A String that describes the server
|
||||
* @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
|
||||
*/
|
||||
void {{classname}}::setNewServer(const QString &operation, const QUrl &url, const QString &description, const QMap<QString, {{prefix}}ServerVariable> &variables) {
|
||||
setServerIndex(operation, addServerConfiguration(operation, url, description, variables));
|
||||
}
|
||||
|
||||
@@ -30,6 +30,7 @@ public:
|
||||
void initializeServerConfigs();
|
||||
int setDefaultServerValue(int serverIndex,const QString &operation, const QString &variable,const QString &val);
|
||||
void setServerIndex(const QString &operation, int serverIndex);
|
||||
void setServerIndex(int serverIndex);
|
||||
void setApiKey(const QString &apiKeyName, const QString &apiKey);
|
||||
void setBearerToken(const QString &token);
|
||||
void setUsername(const QString &username);
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{>partial_header}}
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{>partial_header}}
|
||||
using System;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using {{packageName}}.{{apiPackage}};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -53,4 +54,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
parseQueryString[ClientUtils.ApiKeyHeaderToString(Header)] = Uri.EscapeDataString(_raw).ToString(){{nrt!}};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{>partial_header}}
|
||||
using System;
|
||||
|
||||
namespace {{packageName}}.{{clientPackage}}
|
||||
|
||||
@@ -49,6 +49,11 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
/// </summary>
|
||||
System.Net.Http.Headers.HttpResponseHeaders Headers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The headers contained in the api response related to the content
|
||||
/// </summary>
|
||||
System.Net.Http.Headers.HttpContentHeaders ContentHeaders { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The path used when making the request.
|
||||
/// </summary>
|
||||
@@ -106,6 +111,11 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
/// </summary>
|
||||
public System.Net.Http.Headers.HttpResponseHeaders Headers { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The headers contained in the api response related to the content
|
||||
/// </summary>
|
||||
public System.Net.Http.Headers.HttpContentHeaders ContentHeaders { get; }
|
||||
|
||||
/// <summary>
|
||||
/// The DateTime when the request was retrieved.
|
||||
/// </summary>
|
||||
@@ -144,6 +154,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
{
|
||||
StatusCode = httpResponseMessage.StatusCode;
|
||||
Headers = httpResponseMessage.Headers;
|
||||
ContentHeaders = httpResponseMessage.Content.Headers;
|
||||
IsSuccessStatusCode = httpResponseMessage.IsSuccessStatusCode;
|
||||
ReasonPhrase = httpResponseMessage.ReasonPhrase;
|
||||
RawContent = rawContent;
|
||||
@@ -167,6 +178,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
{
|
||||
StatusCode = httpResponseMessage.StatusCode;
|
||||
Headers = httpResponseMessage.Headers;
|
||||
ContentHeaders = httpResponseMessage.Content.Headers;
|
||||
IsSuccessStatusCode = httpResponseMessage.IsSuccessStatusCode;
|
||||
ReasonPhrase = httpResponseMessage.ReasonPhrase;
|
||||
ContentStream = contentStream;
|
||||
@@ -178,6 +190,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
OnCreated(httpRequestMessage, httpResponseMessage);
|
||||
}
|
||||
|
||||
|
||||
partial void OnCreated(global::System.Net.Http.HttpRequestMessage httpRequestMessage, System.Net.Http.HttpResponseMessage httpResponseMessage);
|
||||
}
|
||||
{{#x-http-statuses-with-return}}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -43,4 +44,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", {{packageName}}.Client.ClientUtils.Base64Encode(_username + ":" + _password));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -38,4 +39,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _raw);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ using {{packageName}}.{{modelPackage}};
|
||||
{{/-first}}
|
||||
{{/models}}
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Net.Http.Headers;
|
||||
|
||||
{{>Assembly}}namespace {{packageName}}.{{clientPackage}}
|
||||
{
|
||||
@@ -311,6 +312,36 @@ using System.Runtime.CompilerServices;
|
||||
return string.Join(",", accepts);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Select the Accept header's value from the given accepts array:
|
||||
/// if JSON exists in the given array, use it;
|
||||
/// otherwise use all of them.
|
||||
/// </summary>
|
||||
/// <param name="accepts">The accepts array to select from.</param>
|
||||
/// <returns>The Accept header values to use.</returns>
|
||||
public static IEnumerable<MediaTypeWithQualityHeaderValue> SelectHeaderAcceptArray(string[] accepts)
|
||||
{
|
||||
if (accepts.Length == 0)
|
||||
{{#net80OrLater}}
|
||||
return [];
|
||||
{{/net80OrLater}}
|
||||
{{^net80OrLater}}
|
||||
return Enumerable.Empty<MediaTypeWithQualityHeaderValue>();
|
||||
{{/net80OrLater}}
|
||||
|
||||
if (accepts.Contains("application/json", StringComparer.OrdinalIgnoreCase))
|
||||
{{#net80OrLater}}
|
||||
return [MediaTypeWithQualityHeaderValue.Parse("application/json")];
|
||||
{{/net80OrLater}}
|
||||
{{^net80OrLater}}
|
||||
return new [] { MediaTypeWithQualityHeaderValue.Parse("application/json") };
|
||||
{{/net80OrLater}}
|
||||
|
||||
return accepts.Select(MediaTypeWithQualityHeaderValue.Parse);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Provides a case-insensitive check that a provided content type is a known JSON-like content type.
|
||||
/// </summary>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -19,4 +20,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
/// </summary>
|
||||
public System.Net.CookieContainer Value { get; } = new System.Net.CookieContainer();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{>partial_header}}
|
||||
using System;
|
||||
|
||||
namespace {{packageName}}.{{clientPackage}}
|
||||
|
||||
@@ -98,7 +98,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
|
||||
List<IHttpClientBuilder> builders = new List<IHttpClientBuilder>();
|
||||
|
||||
{{#apiInfo}}{{#apis}}builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{classname}}, {{classname}}>(client));
|
||||
{{#apiInfo}}{{#apis}}builders.Add(_services.AddHttpClient<{{interfacePrefix}}{{classname}}, {{classname}}>("{{packageName}}.{{apiPackage}}.{{interfacePrefix}}{{classname}}", client));
|
||||
{{/apis}}{{/apiInfo}}
|
||||
if (builder != null)
|
||||
foreach (IHttpClientBuilder instance in builders)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -42,4 +43,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
request.Headers.Add(signedHeader.Key, signedHeader.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
{{>partial_header}}
|
||||
using System.Net.Http;
|
||||
|
||||
namespace {{packageName}}.{{apiPackage}}
|
||||
@@ -12,4 +13,4 @@ namespace {{packageName}}.{{apiPackage}}
|
||||
/// </summary>
|
||||
HttpClient HttpClient { get; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -26,4 +27,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
Options = options;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -38,4 +39,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _raw);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// <auto-generated>
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -17,21 +16,25 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
/// <typeparam name="TTokenBase"></typeparam>
|
||||
{{>visibility}} class RateLimitProvider<TTokenBase> : TokenProvider<TTokenBase> where TTokenBase : TokenBase
|
||||
{
|
||||
internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new{{^net70OrLater}} Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>>{{/net70OrLater}}();
|
||||
/// <summary>
|
||||
/// Dictionary mapping header names to channels of available tokens for rate limiting.
|
||||
/// Each channel buffers tokens that have become available and are ready for use.
|
||||
/// </summary>
|
||||
protected internal Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>> AvailableTokens { get; } = new{{^net70OrLater}} Dictionary<string, global::System.Threading.Channels.Channel<TTokenBase>>{{/net70OrLater}}();
|
||||
|
||||
/// <summary>
|
||||
/// Instantiates a ThrottledTokenProvider. Your tokens will be rate limited based on the token's timeout.
|
||||
/// </summary>
|
||||
/// <param name="container"></param>
|
||||
public RateLimitProvider(TokenContainer<TTokenBase> container) : base(container.Tokens)
|
||||
public RateLimitProvider(TokenContainer<TTokenBase> container) : base()
|
||||
{
|
||||
foreach(TTokenBase token in _tokens)
|
||||
foreach(TTokenBase token in container.Tokens)
|
||||
token.StartTimer(token.Timeout ?? TimeSpan.FromMilliseconds(40));
|
||||
|
||||
{{#lambda.copy}}
|
||||
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(_tokens.Length)
|
||||
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(container.Tokens.Count)
|
||||
{
|
||||
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
|
||||
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
|
||||
};
|
||||
|
||||
AvailableTokens.Add(string.Empty, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
|
||||
@@ -45,7 +48,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
{
|
||||
global::System.Threading.Channels.BoundedChannelOptions options = new global::System.Threading.Channels.BoundedChannelOptions(apiKeyTokenContainer.Tokens.Count(t => ClientUtils.ApiKeyHeaderToString(t.Header).Equals(header)))
|
||||
{
|
||||
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropWrite
|
||||
FullMode = global::System.Threading.Channels.BoundedChannelFullMode.DropOldest
|
||||
};
|
||||
|
||||
AvailableTokens.Add(header, global::System.Threading.Channels.Channel.CreateBounded<TTokenBase>(options));
|
||||
@@ -65,7 +68,7 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
{{/hasApiKeyMethods}}
|
||||
|
||||
foreach (var availableToken in AvailableTokens)
|
||||
foreach(TTokenBase token in _tokens)
|
||||
foreach(TTokenBase token in container.Tokens)
|
||||
{
|
||||
{{#hasApiKeyMethods}}
|
||||
if (token is ApiKeyToken apiKeyToken)
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -17,11 +18,18 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
private object _nextAvailableLock = new object();
|
||||
private readonly System.Timers.Timer _timer = new System.Timers.Timer();
|
||||
|
||||
|
||||
internal TimeSpan? Timeout { get; set; }
|
||||
internal delegate void TokenBecameAvailableEventHandler(object sender);
|
||||
internal event TokenBecameAvailableEventHandler{{nrt?}} TokenBecameAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Delegate for token availability notification events.
|
||||
/// </summary>
|
||||
/// <param name="sender">The token that became available.</param>
|
||||
public delegate void TokenBecameAvailableEventHandler(object sender);
|
||||
|
||||
/// <summary>
|
||||
/// Event raised when a rate-limited token becomes available for use.
|
||||
/// </summary>
|
||||
public event TokenBecameAvailableEventHandler{{nrt?}} TokenBecameAvailable;
|
||||
|
||||
/// <summary>
|
||||
/// Initialize a TokenBase object.
|
||||
@@ -35,7 +43,6 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
StartTimer(Timeout.Value);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Starts the token's timer
|
||||
/// </summary>
|
||||
@@ -70,4 +77,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
TokenBecameAvailable.Invoke(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// <auto-generated>
|
||||
{{partial_header}}
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -36,4 +37,4 @@ namespace {{packageName}}.{{clientPackage}}
|
||||
Tokens = tokens.ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// <auto-generated>
|
||||
{{>partial_header}}
|
||||
|
||||
{{#nrt}}
|
||||
#nullable enable
|
||||
|
||||
@@ -18,24 +17,11 @@ namespace {{packageName}}
|
||||
{{>visibility}} abstract class TokenProvider<TTokenBase> where TTokenBase : TokenBase
|
||||
{
|
||||
/// <summary>
|
||||
/// The array of tokens.
|
||||
/// Gets a token asynchronously for the specified header.
|
||||
/// </summary>
|
||||
protected TTokenBase[] _tokens;
|
||||
|
||||
/// <summary>
|
||||
/// Gets an authentication token to be used in request authorization.
|
||||
/// </summary>
|
||||
/// <param name="header"></param>
|
||||
/// <param name="cancellation"></param>
|
||||
/// <param name="header">The header name to retrieve a token for. Empty string for non-API-key authentication schemes.</param>
|
||||
/// <param name="cancellation">Cancellation token for the asynchronous operation.</param>
|
||||
/// <returns>A task that returns the requested token.</returns>
|
||||
protected internal abstract System.Threading.Tasks.ValueTask<TTokenBase> GetAsync(string header = "", System.Threading.CancellationToken cancellation = default{{^netstandard20OrLater}}(global::System.Threading.CancellationToken){{/netstandard20OrLater}});
|
||||
|
||||
/// <summary>
|
||||
/// Instantiates a TokenProvider.
|
||||
/// </summary>
|
||||
/// <param name="tokens"></param>
|
||||
public TokenProvider(IEnumerable<TTokenBase> tokens)
|
||||
{
|
||||
_tokens = tokens.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@
|
||||
{{/nrt}}
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
{{#net80OrLater}}
|
||||
{{#lambda.uniqueLines}}
|
||||
{{#operations}}
|
||||
@@ -20,6 +21,7 @@ using System.Linq;
|
||||
{{/lambda.uniqueLines}}
|
||||
{{/net80OrLater}}
|
||||
using System.Net;
|
||||
using System.IO;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using System.Net.Http;
|
||||
@@ -605,10 +607,10 @@ namespace {{packageName}}.{{apiPackage}}
|
||||
{{#produces}}
|
||||
{{#-first}}
|
||||
|
||||
string{{nrt?}} acceptLocalVar = ClientUtils.SelectHeaderAccept(acceptLocalVars);
|
||||
IEnumerable<MediaTypeWithQualityHeaderValue> acceptHeaderValuesLocalVar = ClientUtils.SelectHeaderAcceptArray(acceptLocalVars);
|
||||
|
||||
if (acceptLocalVar != null)
|
||||
httpRequestMessageLocalVar.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(acceptLocalVar));
|
||||
foreach (var acceptLocalVar in acceptHeaderValuesLocalVar)
|
||||
httpRequestMessageLocalVar.Headers.Accept.Add(acceptLocalVar);
|
||||
{{/-first}}
|
||||
{{/produces}}
|
||||
{{#net60OrLater}}
|
||||
|
||||
@@ -36,13 +36,74 @@
|
||||
<PackageReference Include="RestSharp" Version="112.0.0" />
|
||||
{{/useRestSharp}}
|
||||
{{#useGenericHost}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Version="{{#lambda.first}}{{#netStandard}}5.0.0 {{/netStandard}}{{#net47}}7.0.0 {{/net47}}{{#net48}}7.0.0 {{/net48}}{{#net6.0}}6.0.0 {{/net6.0}}{{#net7.0}}7.0.0 {{/net7.0}}{{#net8.0}}8.0.1 {{/net8.0}}{{#net9.0}}9.0.5 {{/net9.0}}{{#net10.0}}10.0.1 {{/net10.0}}{{/lambda.first}}" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Version="{{#lambda.first}}{{#netStandard}}5.0.0 {{/netStandard}}{{#net47}}7.0.0 {{/net47}}{{#net48}}7.0.0 {{/net48}}{{#net6.0}}6.0.1 {{/net6.0}}{{#net7.0}}7.0.1 {{/net7.0}}{{#net8.0}}8.0.1 {{/net8.0}}{{#net9.0}}9.0.5 {{/net9.0}}{{#net10.0}}10.0.1 {{/net10.0}}{{/lambda.first}}" />
|
||||
{{#netStandard}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'netstandard1.4' or '$(TargetFramework)' == 'netstandard1.5' or '$(TargetFramework)' == 'netstandard1.6' or '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'netstandard1.4' or '$(TargetFramework)' == 'netstandard1.5' or '$(TargetFramework)' == 'netstandard1.6' or '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'" Version="6.0.1" />
|
||||
{{/netStandard}}
|
||||
{{#net47}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net47' or '$(TargetFramework)' == 'net471' or '$(TargetFramework)' == 'net472'" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net47' or '$(TargetFramework)' == 'net471' or '$(TargetFramework)' == 'net472'" Version="7.0.0" />
|
||||
{{/net47}}
|
||||
{{#net48}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net48' or '$(TargetFramework)' == 'net481'" Version="7.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net48' or '$(TargetFramework)' == 'net481'" Version="7.0.0" />
|
||||
{{/net48}}
|
||||
{{#net6.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net6.0'" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net6.0'" Version="6.0.1" />
|
||||
{{/net6.0}}
|
||||
{{#net7.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net7.0'" Version=7.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net7.0'" Version="7.0.1" />
|
||||
{{/net7.0}}
|
||||
{{#net8.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net8.0'" Version="8.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net8.0'" Version="8.0.1" />
|
||||
{{/net8.0}}
|
||||
{{#net9.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net9.0'" Version="9.0.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net9.0'" Version="9.0.6" />
|
||||
{{/net9.0}}
|
||||
{{#net10.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http" Condition="'$(TargetFramework)' == 'net10.0'" Version="10.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting" Condition="'$(TargetFramework)' == 'net10.0'" Version="10.0.1" />
|
||||
{{/net10.0}}
|
||||
{{#supportsRetry}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="{{#lambda.first}}{{#netStandard}}5.0.1 {{/netStandard}}{{#net47}}7.0.0 {{/net47}}{{#net48}}7.0.0 {{/net48}}{{#net6.0}}6.0.19 {{/net6.0}}{{#net7.0}}7.0.11 {{/net7.0}}{{#net8.0}}8.0.8 {{/net8.0}}{{#net9.0}}9.0.5 {{/net9.0}}{{#net10.0}}10.0.1 {{/net10.0}}{{/lambda.first}}" />
|
||||
{{#netStandard}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'netstandard1.3' or '$(TargetFramework)' == 'netstandard1.4' or '$(TargetFramework)' == 'netstandard1.5' or '$(TargetFramework)' == 'netstandard1.6' or '$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'" Version="5.0.1" />
|
||||
{{/netStandard}}
|
||||
{{#net47}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net47' or '$(TargetFramework)' == 'net471' or '$(TargetFramework)' == 'net472'" Version="7.0.0" />
|
||||
{{/net47}}
|
||||
{{#net48}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net48' or '$(TargetFramework)' == 'net481'" Version="7.0.0" />
|
||||
{{/net48}}
|
||||
{{#net6.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net6.0'" Version="6.0.36" />
|
||||
{{/net6.0}}
|
||||
{{#net7.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net7.0'" Version="7.0.20" />
|
||||
{{/net7.0}}
|
||||
{{#net8.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net8.0'" Version="8.0.20" />
|
||||
{{/net8.0}}
|
||||
{{#net9.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net9.0'" Version="9.0.6" />
|
||||
{{/net9.0}}
|
||||
{{#net10.0}}
|
||||
<PackageReference Include="Microsoft.Extensions.Http.Polly" Condition="'$(TargetFramework)' == 'net10.0'" Version="10.0.1" />
|
||||
{{/net10.0}}
|
||||
{{/supportsRetry}}
|
||||
{{#net80OrLater}}
|
||||
<PackageReference Include="Microsoft.Net.Http.Headers" Version="{{#lambda.first}}{{#net8.0}}8.0.8 {{/net8.0}}{{#net9.0}}9.0.5 {{/net9.0}}{{#net10.0}}10.0.1 {{/net10.0}}{{/lambda.first}}" />
|
||||
{{#net8.0}}
|
||||
<PackageReference Include="Microsoft.Net.Http.Headers" Condition="'$(TargetFramework)' == 'net8.0'" Version="8.0.17" />
|
||||
{{/net8.0}}
|
||||
{{#net9.0}}
|
||||
<PackageReference Include="Microsoft.Net.Http.Headers" Condition="'$(TargetFramework)' == 'net9.0'" Version="9.0.6" />
|
||||
{{/net9.0}}
|
||||
{{#net10.0}}
|
||||
<PackageReference Include="Microsoft.Net.Http.Headers" Condition="'$(TargetFramework)' == 'net10.0'" Version="10.0.1" />
|
||||
{{/net10.0}}
|
||||
{{/net80OrLater}}
|
||||
{{^net60OrLater}}
|
||||
<PackageReference Include="System.Threading.Channels" Version="8.0.0" />
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
{{#isBodyParam}}<div class="param">{{baseName}} {{#baseType}}<a href="#{{baseType}}">{{baseType}}</a>{{/baseType}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
|
||||
{{#isBodyParam}}<div class="param">{{baseName}} {{#isContainer}}{{containerType}}[{{/isContainer}}{{#baseType}}<a href="#{{baseType}}">{{baseType}}</a>{{/baseType}}{{#isContainer}}]{{/isContainer}} {{^required}}(optional){{/required}}{{#required}}(required){{/required}}</div>
|
||||
|
||||
<div class="param-desc"><span class="param-type">Body Parameter</span> — {{unescapedDescription}} {{#defaultValue}}default: {{{.}}}{{/defaultValue}}</div>{{/isBodyParam}}
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<version.logback>1.5.19</version.logback>
|
||||
<version.junit>4.13.2</version.junit>
|
||||
<version.mockito>2.1.0-beta.124</version.mockito>
|
||||
<version.undertow>2.3.20.Final</version.undertow>
|
||||
<version.undertow>2.3.21.Final</version.undertow>
|
||||
<version.jsonpath>2.2.0</version.jsonpath>
|
||||
<version.httpclient>4.5.13</version.httpclient>
|
||||
<version.httpasyncclient>4.1.2</version.httpasyncclient>
|
||||
|
||||
@@ -142,10 +142,13 @@
|
||||
#' @param data_file (optional) name of the data file to save the result
|
||||
{{/returnType}}
|
||||
#' @param ... Other optional arguments
|
||||
{{#returnType}}
|
||||
#' @param .parse Logical. If \code{TRUE} then the response will be parsed to a generated type. If \code{FALSE} the response will be returned as unparsed text.
|
||||
{{/returnType}}
|
||||
#'
|
||||
#' @return {{{returnType}}}{{^returnType}}void{{/returnType}}
|
||||
{{{operationId}}} = function({{#requiredParams}}{{paramName}}, {{/requiredParams}}{{#optionalParams}}{{paramName}} = {{^defaultValue}}NULL{{/defaultValue}}{{{defaultValue}}}, {{/optionalParams}}{{#vendorExtensions.x-streaming}}stream_callback = NULL, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = NULL, {{/returnType}}...) {
|
||||
local_var_response <- self${{{operationId}}}{{WithHttpInfo}}({{#allParams}}{{paramName}}, {{/allParams}}{{#vendorExtensions.x-streaming}}stream_callback = stream_callback, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = data_file, {{/returnType}}...)
|
||||
{{{operationId}}} = function({{#requiredParams}}{{paramName}}, {{/requiredParams}}{{#optionalParams}}{{paramName}} = {{^defaultValue}}NULL{{/defaultValue}}{{{defaultValue}}}, {{/optionalParams}}{{#vendorExtensions.x-streaming}}stream_callback = NULL, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = NULL, {{/returnType}}...{{#returnType}}, .parse = TRUE{{/returnType}}) {
|
||||
local_var_response <- self${{{operationId}}}{{WithHttpInfo}}({{#allParams}}{{paramName}}, {{/allParams}}{{#vendorExtensions.x-streaming}}stream_callback = stream_callback, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = data_file, {{/returnType}}...{{#returnType}}, .parse = .parse{{/returnType}})
|
||||
{{#vendorExtensions.x-streaming}}
|
||||
if (typeof(stream_callback) == "closure") { # return void if streaming is enabled
|
||||
return(invisible(NULL))
|
||||
@@ -178,9 +181,12 @@
|
||||
#' @param data_file (optional) name of the data file to save the result
|
||||
{{/returnType}}
|
||||
#' @param ... Other optional arguments
|
||||
{{#returnType}}
|
||||
#' @param .parse Logical. If \code{TRUE} then the response will be parsed to a generated type. If \code{FALSE} the response will be returned as unparsed text.
|
||||
{{/returnType}}
|
||||
#'
|
||||
#' @return API response ({{{returnType}}}{{^returnType}}void{{/returnType}}) with additional information such as HTTP status code, headers
|
||||
{{{operationId}}}{{WithHttpInfo}} = function({{#requiredParams}}{{paramName}}, {{/requiredParams}}{{#optionalParams}}{{paramName}} = {{^defaultValue}}NULL{{/defaultValue}}{{{defaultValue}}}, {{/optionalParams}}{{#vendorExtensions.x-streaming}}stream_callback = NULL, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = NULL, {{/returnType}}...) {
|
||||
{{{operationId}}}{{WithHttpInfo}} = function({{#requiredParams}}{{paramName}}, {{/requiredParams}}{{#optionalParams}}{{paramName}} = {{^defaultValue}}NULL{{/defaultValue}}{{{defaultValue}}}, {{/optionalParams}}{{#vendorExtensions.x-streaming}}stream_callback = NULL, {{/vendorExtensions.x-streaming}}{{#returnType}}data_file = NULL, {{/returnType}}...{{#returnType}}, .parse = TRUE{{/returnType}}) {
|
||||
args <- list(...)
|
||||
query_params <- list()
|
||||
header_params <- c()
|
||||
@@ -559,6 +565,10 @@
|
||||
if (!is.null(data_file)) {
|
||||
self$api_client$WriteFile(local_var_resp, data_file)
|
||||
}
|
||||
if (!.parse) {
|
||||
local_var_resp$content <- local_var_resp$response_as_text()
|
||||
return(local_var_resp)
|
||||
}
|
||||
|
||||
ApiResponse$new(content = content, response = resp, status_code = local_var_resp$status_code)
|
||||
{{/isPrimitiveType}}
|
||||
@@ -567,6 +577,10 @@
|
||||
if (!is.null(data_file)) {
|
||||
self$api_client$WriteFile(local_var_resp, data_file)
|
||||
}
|
||||
if (!.parse) {
|
||||
local_var_resp$content <- local_var_resp$response_as_text()
|
||||
return(local_var_resp)
|
||||
}
|
||||
|
||||
deserialized_resp_obj <- tryCatch(
|
||||
self$api_client$DeserializeResponse(local_var_resp, "{{returnType}}"),
|
||||
|
||||
@@ -106,6 +106,17 @@ impl std::ops::DerefMut for {{{classname}}} {
|
||||
}
|
||||
}
|
||||
|
||||
{{^hasConflictingModelNames}}
|
||||
#[cfg(feature = "validate")]
|
||||
impl serde_valid::validation::ValidateCompositedMinLength for {{{classname}}} {
|
||||
fn validate_composited_min_length(
|
||||
&self,
|
||||
_min_length: usize,
|
||||
) -> Result<(), serde_valid::validation::Composited<serde_valid::validation::error::MinLengthError>> {
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
{{/hasConflictingModelNames}}
|
||||
{{#exts.x-to-string-support}}
|
||||
{{#exts.x-is-string}}
|
||||
impl std::fmt::Display for {{{classname}}} {
|
||||
@@ -364,13 +375,13 @@ pub struct {{{classname}}} {
|
||||
)]
|
||||
{{/hasConflictingModelNames}}
|
||||
{{/hasValidation}}
|
||||
{{#required}}
|
||||
{{^hasConflictingModelNames}}{{>validate}}{{/hasConflictingModelNames}}
|
||||
{{^hasConflictingModelNames}}
|
||||
{{#exts.x-needs-nested-validation}}
|
||||
#[cfg_attr(feature = "validate", validate)]
|
||||
{{^minLength}}{{^maxLength}}{{^minItems}}{{^maxItems}}#[cfg_attr(feature = "validate", validate)]{{/maxItems}}{{/minItems}}{{/maxLength}}{{/minLength}}
|
||||
{{/exts.x-needs-nested-validation}}
|
||||
{{/hasConflictingModelNames}}
|
||||
{{#required}}
|
||||
pub {{{name}}}: {{{dataType}}},
|
||||
{{/required}}
|
||||
{{^required}}
|
||||
@@ -378,9 +389,10 @@ pub struct {{{classname}}} {
|
||||
#[serde(deserialize_with = "swagger::nullable_format::deserialize_optional_nullable")]
|
||||
#[serde(default = "swagger::nullable_format::default_optional_nullable")]
|
||||
{{/isNullable}}
|
||||
{{^hasConflictingModelNames}}{{>validate}}{{/hasConflictingModelNames}}
|
||||
{{^hasConflictingModelNames}}
|
||||
{{#exts.x-needs-nested-validation}}
|
||||
#[cfg_attr(feature = "validate", validate)]
|
||||
{{^minLength}}{{^maxLength}}{{^minItems}}{{^maxItems}}#[cfg_attr(feature = "validate", validate)]{{/maxItems}}{{/minItems}}{{/maxLength}}{{/minLength}}
|
||||
{{/exts.x-needs-nested-validation}}
|
||||
{{/hasConflictingModelNames}}
|
||||
#[serde(skip_serializing_if="Option::is_none")]
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
import Foundation{{#useVapor}}
|
||||
import Vapor{{/useVapor}}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct APIHelper {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct APIHelper: Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} static func rejectNil(_ source: [String: (any Sendable)?]) -> [String: any Sendable]? {
|
||||
let destination = source.reduce(into: [String: any Sendable]()) { result, item in
|
||||
if let value = item.value {
|
||||
|
||||
@@ -19,8 +19,8 @@ import Alamofire{{/useAlamofire}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var basePath: String{{#useVapor}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var customHeaders: HTTPHeaders
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiClient: Vapor.Client?
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiWrapper: (inout Vapor.ClientRequest) throws -> ()
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var contentConfiguration{{/useVapor}}{{^useVapor}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var apiWrapper: @Sendable (inout Vapor.ClientRequest) throws -> ()
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var contentConfiguration: ContentConfiguration{{/useVapor}}{{^useVapor}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var customHeaders: [String: String]
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var credential: URLCredential?
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var requestBuilderFactory: RequestBuilderFactory
|
||||
@@ -49,8 +49,8 @@ import Alamofire{{/useAlamofire}}
|
||||
basePath: String = "{{{basePath}}}",{{#useVapor}}
|
||||
customHeaders: HTTPHeaders = [:],
|
||||
apiClient: Vapor.Client? = nil,
|
||||
apiWrapper: (inout Vapor.ClientRequest) throws -> () = { _ in },
|
||||
contentConfiguration = ContentConfiguration.default(){{/useVapor}}{{^useVapor}}
|
||||
apiWrapper: @escaping @Sendable (inout Vapor.ClientRequest) throws -> () = { _ in },
|
||||
contentConfiguration: ContentConfiguration = ContentConfiguration.default(){{/useVapor}}{{^useVapor}}
|
||||
customHeaders: [String: String] = [:],
|
||||
credential: URLCredential? = nil,
|
||||
requestBuilderFactory: RequestBuilderFactory = {{#useAlamofire}}AlamofireRequestBuilderFactory(){{/useAlamofire}}{{#useURLSession}}URLSessionRequestBuilderFactory(){{/useURLSession}},
|
||||
@@ -63,10 +63,10 @@ import Alamofire{{/useAlamofire}}
|
||||
stringResponseSerializer: AnyResponseSerializer<String> = AnyResponseSerializer(StringResponseSerializer()){{/useAlamofire}}{{/useVapor}}
|
||||
) {
|
||||
self.basePath = basePath{{#useVapor}}
|
||||
customHeaders = customHeaders
|
||||
apiClient = apiClient
|
||||
apiWrapper = apiWrapper
|
||||
contentConfiguration = contentConfiguration{{/useVapor}}{{^useVapor}}
|
||||
self.customHeaders = customHeaders
|
||||
self.apiClient = apiClient
|
||||
self.apiWrapper = apiWrapper
|
||||
self.contentConfiguration = contentConfiguration{{/useVapor}}{{^useVapor}}
|
||||
self.customHeaders = customHeaders
|
||||
self.credential = credential
|
||||
self.requestBuilderFactory = requestBuilderFactory
|
||||
@@ -82,7 +82,7 @@ import Alamofire{{/useAlamofire}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} static let shared = {{projectName}}APIConfiguration()
|
||||
}{{^useVapor}}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class RequestBuilder<T>: @unchecked Sendable, Identifiable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class RequestBuilder<T: Sendable>: @unchecked Sendable, Identifiable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var credential: URLCredential?
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var headers: [String: String]
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} let parameters: [String: any Sendable]?
|
||||
@@ -119,9 +119,21 @@ import Alamofire{{/useAlamofire}}
|
||||
}
|
||||
|
||||
{{#useAsyncAwait}}
|
||||
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||
#if compiler(>=6.2)
|
||||
@concurrent
|
||||
@discardableResult
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func execute() async throws(ErrorResponse) -> Response<T> {
|
||||
try await _execute()
|
||||
}
|
||||
#else
|
||||
@discardableResult
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} func execute() async throws(ErrorResponse) -> Response<T> {
|
||||
try await _execute()
|
||||
}
|
||||
#endif
|
||||
|
||||
@discardableResult
|
||||
private func _execute() async throws(ErrorResponse) -> Response<T> {
|
||||
do {
|
||||
let requestTask = self.requestTask
|
||||
return try await withTaskCancellationHandler {
|
||||
@@ -135,7 +147,6 @@ import Alamofire{{/useAlamofire}}
|
||||
self.execute { result in
|
||||
switch result {
|
||||
case let .success(response):
|
||||
nonisolated(unsafe) let response = response
|
||||
continuation.resume(returning: response)
|
||||
case let .failure(error):
|
||||
continuation.resume(throwing: error)
|
||||
@@ -153,7 +164,7 @@ import Alamofire{{/useAlamofire}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
{{/useAsyncAwait}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} func addHeader(name: String, value: String) -> Self {
|
||||
if !value.isEmpty {
|
||||
@@ -167,7 +178,7 @@ import Alamofire{{/useAlamofire}}
|
||||
}
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} protocol RequestBuilderFactory {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} protocol RequestBuilderFactory: Sendable {
|
||||
func getNonDecodableBuilder<T>() -> RequestBuilder<T>.Type
|
||||
func getBuilder<T: Decodable>() -> RequestBuilder<T>.Type
|
||||
}{{/useVapor}}
|
||||
|
||||
@@ -236,13 +236,11 @@ extension RequestBuilder {
|
||||
}
|
||||
}{{/usePromiseKit}}{{#useVapor}}
|
||||
|
||||
extension UUID: Content { }
|
||||
extension UUID: @retroactive Content { }
|
||||
|
||||
extension URL: Content { }
|
||||
extension URL: @retroactive Content { }
|
||||
|
||||
extension Bool: Content { }
|
||||
|
||||
extension Set: ResponseEncodable where Element: Content {
|
||||
extension Set: @retroactive ResponseEncodable where Element: Content {
|
||||
public func encodeResponse(for request: Vapor.Request) -> EventLoopFuture<Vapor.Response> {
|
||||
let response = Vapor.Response()
|
||||
do {
|
||||
@@ -254,7 +252,15 @@ extension Set: ResponseEncodable where Element: Content {
|
||||
}
|
||||
}
|
||||
|
||||
extension Set: RequestDecodable where Element: Content {
|
||||
extension Set: @retroactive AsyncResponseEncodable where Element: Content {
|
||||
public func encodeResponse(for request: Vapor.Request) async throws -> Vapor.Response {
|
||||
let response = Vapor.Response()
|
||||
try response.content.encode(Array(self))
|
||||
return response
|
||||
}
|
||||
}
|
||||
|
||||
extension Set: @retroactive RequestDecodable where Element: Content {
|
||||
public static func decodeRequest(_ request: Vapor.Request) -> EventLoopFuture<Self> {
|
||||
do {
|
||||
let content = try request.content.decode([Element].self)
|
||||
@@ -265,6 +271,13 @@ extension Set: RequestDecodable where Element: Content {
|
||||
}
|
||||
}
|
||||
|
||||
extension Set: Content where Element: Content { }
|
||||
extension Set: @retroactive AsyncRequestDecodable where Element: Content {
|
||||
public static func decodeRequest(_ request: Vapor.Request) async throws -> Self {
|
||||
let content = try request.content.decode([Element].self)
|
||||
return Set(content)
|
||||
}
|
||||
}
|
||||
|
||||
extension Set: @retroactive Content where Element: Content { }
|
||||
|
||||
extension JSONValue: Content {}{{/useVapor}}
|
||||
|
||||
@@ -70,11 +70,11 @@ extension NullEncodable: Codable where Wrapped: Codable {
|
||||
}
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum ErrorResponse: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum ErrorResponse: Error, Sendable {
|
||||
case error(Int, Data?, URLResponse?, Error)
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum DownloadException: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum DownloadException: Error, Sendable {
|
||||
case responseDataMissing
|
||||
case responseFailed
|
||||
case requestMissing
|
||||
@@ -82,7 +82,7 @@ extension NullEncodable: Codable where Wrapped: Codable {
|
||||
case requestMissingURL
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum DecodableRequestBuilderError: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum DecodableRequestBuilderError: Error, Sendable {
|
||||
case emptyDataResponse
|
||||
case nilHTTPResponse
|
||||
case unsuccessfulHTTPStatusCode
|
||||
|
||||
@@ -9,10 +9,10 @@ let package = Package(
|
||||
.macOS(.v10_15),
|
||||
{{/useVapor}}
|
||||
{{^useVapor}}
|
||||
.iOS(.v12),
|
||||
.macOS(.v10_13),
|
||||
.tvOS(.v12),
|
||||
.watchOS(.v4),
|
||||
.iOS(.v13),
|
||||
.macOS(.v10_15),
|
||||
.tvOS(.v13),
|
||||
.watchOS(.v6),
|
||||
{{/useVapor}}
|
||||
],
|
||||
products: [
|
||||
@@ -34,7 +34,7 @@ let package = Package(
|
||||
.package(url: "https://github.com/ReactiveX/RxSwift", .upToNextMajor(from: "6.8.0")),
|
||||
{{/useRxSwift}}
|
||||
{{#useVapor}}
|
||||
.package(url: "https://github.com/vapor/vapor", from: "4.0.0")
|
||||
.package(url: "https://github.com/vapor/vapor", from: "4.99.0"),
|
||||
{{/useVapor}}
|
||||
],
|
||||
targets: [
|
||||
@@ -42,7 +42,7 @@ let package = Package(
|
||||
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
|
||||
.target(
|
||||
name: "{{projectName}}",
|
||||
dependencies: [{{#useVapor}}"Vapor", {{/useVapor}}{{#useAlamofire}}"Alamofire", {{/useAlamofire}}{{#usePromiseKit}}"PromiseKit", {{/usePromiseKit}}{{#useRxSwift}}"RxSwift"{{/useRxSwift}}],
|
||||
dependencies: [{{#useVapor}}.product(name: "Vapor", package: "vapor"){{/useVapor}}{{#useAlamofire}}"Alamofire", {{/useAlamofire}}{{#usePromiseKit}}"PromiseKit", {{/usePromiseKit}}{{#useRxSwift}}"RxSwift"{{/useRxSwift}}],
|
||||
path: "{{swiftPackagePath}}{{^swiftPackagePath}}{{#useSPMFileStructure}}Sources/{{projectName}}{{/useSPMFileStructure}}{{^useSPMFileStructure}}{{projectName}}/Classes{{/useSPMFileStructure}}{{/swiftPackagePath}}"
|
||||
),
|
||||
],
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = '{{projectName}}'{{#projectDescription}}
|
||||
s.summary = '{{.}}'{{/projectDescription}}
|
||||
s.ios.deployment_target = '12.0'
|
||||
s.osx.deployment_target = '10.13'
|
||||
s.tvos.deployment_target = '12.0'
|
||||
s.watchos.deployment_target = '4.0'
|
||||
s.ios.deployment_target = '13.0'
|
||||
s.osx.deployment_target = '10.15'
|
||||
s.tvos.deployment_target = '13.0'
|
||||
s.watchos.deployment_target = '6.0'
|
||||
s.version = '{{podVersion}}{{^podVersion}}{{#apiInfo}}{{version}}{{/apiInfo}}{{^apiInfo}}}0.0.1{{/apiInfo}}{{/podVersion}}'
|
||||
s.source = {{#podSource}}{{& podSource}}{{/podSource}}{{^podSource}}{ :git => 'git@github.com:OpenAPITools/openapi-generator.git', :tag => 'v{{#apiInfo}}{{version}}{{/apiInfo}}{{^apiInfo}}}0.0.1{{/apiInfo}}' }{{/podSource}}
|
||||
{{#podAuthors}}
|
||||
|
||||
@@ -27,23 +27,23 @@ extension NumericRule: Sendable where T: Sendable {}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} var uniqueItems: Bool
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum StringValidationErrorKind: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum StringValidationErrorKind: Error, Sendable {
|
||||
case minLength, maxLength, pattern
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum NumericValidationErrorKind: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum NumericValidationErrorKind: Error, Sendable {
|
||||
case minimum, maximum, multipleOf
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum ArrayValidationErrorKind: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum ArrayValidationErrorKind: Error, Sendable {
|
||||
case minItems, maxItems, uniqueItems
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct ValidationError<T: Error & Hashable>: Error {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct ValidationError<T: Error & Hashable & Sendable>: Error, Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} fileprivate(set) var kinds: Set<T>
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct Validator {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} struct Validator: Sendable {
|
||||
/// Validate a string against a rule.
|
||||
/// - Parameter string: The String you wish to validate.
|
||||
/// - Parameter rule: The StringRule you wish to use for validation.
|
||||
|
||||
@@ -8,9 +8,7 @@
|
||||
import Foundation{{#usePromiseKit}}
|
||||
@preconcurrency import PromiseKit{{/usePromiseKit}}{{#useRxSwift}}
|
||||
@preconcurrency import RxSwift{{/useRxSwift}}{{#useCombine}}
|
||||
#if canImport(Combine)
|
||||
import Combine
|
||||
#endif{{/useCombine}}{{#useVapor}}
|
||||
import Combine{{/useCombine}}{{#useVapor}}
|
||||
import Vapor{{/useVapor}}{{#swiftUseApiNamespace}}
|
||||
|
||||
extension {{projectName}}API {
|
||||
@@ -94,9 +92,7 @@ extension {{projectName}}API {
|
||||
- parameter apiConfiguration: The configuration for the http request.{{/apiStaticMethod}}
|
||||
- returns: Promise<{{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{^returnType}}Void{{/returnType}}>
|
||||
*/
|
||||
{{#isDeprecated}}
|
||||
@available(*, deprecated, message: "This operation is deprecated.")
|
||||
{{/isDeprecated}}
|
||||
@available(*, deprecated, message: "{{#isDeprecated}}This operation is deprecated. | {{/isDeprecated}}NOTICE: We are considering deprecating PromiseKit support in the Swift 6 generator. If you are still using it, please share your use case here: https://github.com/OpenAPITools/openapi-generator/issues/22791")
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}[{{enumName}}_{{operationId}}]{{/isContainer}}{{^isContainer}}{{enumName}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared{{/apiStaticMethod}}) -> Promise<{{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{^returnType}}Void{{/returnType}}> {
|
||||
let deferred = Promise<{{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{^returnType}}Void{{/returnType}}>.pending()
|
||||
{{operationId}}WithRequestBuilder({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: apiConfiguration{{/apiStaticMethod}}).execute { result in
|
||||
@@ -163,11 +159,9 @@ extension {{projectName}}API {
|
||||
- parameter apiConfiguration: The configuration for the http request.{{/apiStaticMethod}}
|
||||
- returns: AnyPublisher<{{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{^returnType}}Void{{/returnType}}, Error>
|
||||
*/
|
||||
#if canImport(Combine)
|
||||
{{#isDeprecated}}
|
||||
@available(*, deprecated, message: "This operation is deprecated.")
|
||||
{{/isDeprecated}}
|
||||
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}[{{enumName}}_{{operationId}}]{{/isContainer}}{{^isContainer}}{{enumName}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared{{/apiStaticMethod}}) -> AnyPublisher<{{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{^returnType}}Void{{/returnType}}, Error> {
|
||||
let requestBuilder = {{operationId}}WithRequestBuilder({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: apiConfiguration{{/apiStaticMethod}})
|
||||
let requestTask = requestBuilder.requestTask
|
||||
@@ -197,7 +191,6 @@ extension {{projectName}}API {
|
||||
.eraseToAnyPublisher()
|
||||
{{/combineDeferred}}
|
||||
}
|
||||
#endif
|
||||
{{/useCombine}}
|
||||
{{#useAsyncAwait}}
|
||||
|
||||
@@ -212,7 +205,6 @@ extension {{projectName}}API {
|
||||
{{#isDeprecated}}
|
||||
@available(*, deprecated, message: "This operation is deprecated.")
|
||||
{{/isDeprecated}}
|
||||
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}[{{enumName}}_{{operationId}}]{{/isContainer}}{{^isContainer}}{{enumName}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared{{/apiStaticMethod}}) async throws(ErrorResponse){{#returnType}} -> {{{returnType}}}{{#returnType}}{{#isResponseOptional}}?{{/isResponseOptional}}{{/returnType}}{{/returnType}} {
|
||||
return try await {{operationId}}WithRequestBuilder({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#apiStaticMethod}}{{#hasParams}}, {{/hasParams}}apiConfiguration: apiConfiguration{{/apiStaticMethod}}).execute().body
|
||||
}
|
||||
@@ -359,19 +351,19 @@ extension {{projectName}}API {
|
||||
{{#isDeprecated}}
|
||||
@available(*, deprecated, message: "This operation is deprecated.")
|
||||
{{/isDeprecated}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}Raw({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders = {{projectName}}APIConfiguration.shared.customHeaders, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<ClientResponse> {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}Raw({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders? = nil, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<ClientResponse> {
|
||||
{{^pathParams}}let{{/pathParams}}{{#pathParams}}{{#-first}}var{{/-first}}{{/pathParams}} localVariablePath = "{{{path}}}"{{#pathParams}}
|
||||
let {{paramName}}PreEscape = String(describing: {{#isEnum}}{{paramName}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}.rawValue{{/isContainer}}{{/isEnum}}{{^isEnum}}{{paramName}}{{/isEnum}})
|
||||
let {{paramName}}PostEscape = {{paramName}}PreEscape.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed) ?? ""
|
||||
localVariablePath = localVariablePath.replacingOccurrences(of: "{{=<% %>=}}{<%baseName%>}<%={{ }}=%>", with: {{paramName}}PostEscape, options: .literal, range: nil){{/pathParams}}
|
||||
let localVariableURLString = apiConfiguration.basePath + localVariablePath
|
||||
|
||||
guard let localVariableApiClient = {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}apiConfiguration.apiClient else {
|
||||
guard let localVariableApiClient = apiConfiguration.apiClient else {
|
||||
fatalError("apiConfiguration.apiClient is not set.")
|
||||
}
|
||||
|
||||
return localVariableApiClient.send(.{{httpMethod}}, headers: headers, to: URI(string: localVariableURLString)) { localVariableRequest in
|
||||
try {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}Configuration.apiWrapper(&localVariableRequest)
|
||||
return localVariableApiClient.send(.{{httpMethod}}, headers: headers ?? apiConfiguration.customHeaders, to: URI(string: localVariableURLString)) { localVariableRequest in
|
||||
try apiConfiguration.apiWrapper(&localVariableRequest)
|
||||
{{#hasHeaderParams}}{{#headerParams}}
|
||||
localVariableRequest.headers.add(name: "{{baseName}}", value: {{#isArray}}{{paramName}}{{^required}}?{{/required}}.map { $0{{#isEnum}}.rawValue{{/isEnum}}.description }.description{{/isArray}}{{^isArray}}{{#isEnum}}{{paramName}}{{^required}}?{{/required}}.rawValue.description{{/isEnum}}{{^isEnum}}{{paramName}}{{^required}}?{{/required}}.description{{/isEnum}}{{/isArray}}{{^required}} ?? ""{{/required}})
|
||||
{{/headerParams}}{{/hasHeaderParams}}
|
||||
@@ -439,8 +431,8 @@ extension {{projectName}}API {
|
||||
{{#isDeprecated}}
|
||||
@available(*, deprecated, message: "This operation is deprecated.")
|
||||
{{/isDeprecated}}
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders = {{projectName}}APIConfiguration.shared.customHeaders, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<{{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}> {
|
||||
return {{operationId}}Raw({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: headers, beforeSend: beforeSend).flatMapThrowing { response -> {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}} in
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} {{#apiStaticMethod}}class {{/apiStaticMethod}}func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isArray}}[{{enumName}}_{{operationId}}]{{/isArray}}{{^isArray}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isArray}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: HTTPHeaders? = nil, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared, beforeSend: (inout ClientRequest) throws -> () = { _ in }) -> EventLoopFuture<{{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}}> {
|
||||
return {{operationId}}Raw({{#allParams}}{{paramName}}: {{paramName}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}headers: headers, apiConfiguration: apiConfiguration, beforeSend: beforeSend).flatMapThrowing { response -> {{#lambda.titlecase}}{{operationId}}{{/lambda.titlecase}} in
|
||||
switch response.status.code {
|
||||
{{#responses}}
|
||||
{{#isDefault}}default{{/isDefault}}{{^isDefault}}case {{code}}{{/isDefault}}:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
import Foundation
|
||||
import Alamofire
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class AlamofireRequestBuilderFactory: RequestBuilderFactory {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} final class AlamofireRequestBuilderFactory: RequestBuilderFactory, Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init() {}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} func getNonDecodableBuilder<T>() -> RequestBuilder<T>.Type {
|
||||
@@ -27,7 +27,7 @@ fileprivate class AlamofireRequestBuilderConfiguration: @unchecked Sendable {
|
||||
var managerStore = SynchronizedDictionary<String, Alamofire.Session>()
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class AlamofireRequestBuilder<T>: RequestBuilder<T>, @unchecked Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class AlamofireRequestBuilder<T: Sendable>: RequestBuilder<T>, @unchecked Sendable {
|
||||
required {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init(method: String, URLString: String, parameters: [String: any Sendable]?, headers: [String: String] = [:], requiresAuthentication: Bool, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared) {
|
||||
super.init(method: method, URLString: URLString, parameters: parameters, headers: headers, requiresAuthentication: requiresAuthentication, apiConfiguration: apiConfiguration)
|
||||
}
|
||||
@@ -255,7 +255,7 @@ fileprivate class AlamofireRequestBuilderConfiguration: @unchecked Sendable {
|
||||
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class AlamofireDecodableRequestBuilder<T: Decodable>: AlamofireRequestBuilder<T>, @unchecked Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class AlamofireDecodableRequestBuilder<T: Decodable & Sendable>: AlamofireRequestBuilder<T>, @unchecked Sendable {
|
||||
|
||||
override fileprivate func processRequest(request: DataRequest, managerId: String, completion: @Sendable @escaping (_ result: Swift.Result<Response<T>, ErrorResponse>) -> Void) {
|
||||
if let credential = self.credential {
|
||||
|
||||
@@ -40,7 +40,7 @@ extension URLSession: URLSessionProtocol {
|
||||
|
||||
extension URLSessionDataTask: URLSessionDataTaskProtocol {}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class URLSessionRequestBuilderFactory: RequestBuilderFactory {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} final class URLSessionRequestBuilderFactory: RequestBuilderFactory, Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init() {}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} func getNonDecodableBuilder<T>() -> RequestBuilder<T>.Type {
|
||||
@@ -69,7 +69,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
var credentialStore = SynchronizedDictionary<Int, URLCredential>()
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionRequestBuilder<T>: RequestBuilder<T>, @unchecked Sendable {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionRequestBuilder<T: Sendable>: RequestBuilder<T>, @unchecked Sendable {
|
||||
|
||||
required {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init(method: String, URLString: String, parameters: [String: any Sendable]?, headers: [String: String] = [:], requiresAuthentication: Bool, apiConfiguration: {{projectName}}APIConfiguration = {{projectName}}APIConfiguration.shared) {
|
||||
super.init(method: method, URLString: URLString, parameters: parameters, headers: headers, requiresAuthentication: requiresAuthentication, apiConfiguration: apiConfiguration)
|
||||
@@ -157,6 +157,8 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
let dataTask = urlSession.dataTaskFromProtocol(with: modifiedRequest) { data, response, error in
|
||||
self.cleanupRequest()
|
||||
|
||||
self.apiConfiguration.interceptor.didReceiveResponse(urlRequest: modifiedRequest, urlSession: urlSession, requestBuilder: self, data: data, response: response, error: error)
|
||||
|
||||
if let error = error {
|
||||
self.retryRequest(
|
||||
urlRequest: modifiedRequest,
|
||||
@@ -196,7 +198,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
return
|
||||
}
|
||||
|
||||
self.processRequestResponse(urlRequest: request, data: data, httpResponse: httpResponse, error: error, completion: completion)
|
||||
self.processRequestResponse(urlRequest: modifiedRequest, urlSession: urlSession, data: data, httpResponse: httpResponse, error: error, completion: completion)
|
||||
}
|
||||
|
||||
self.onProgressReady?(dataTask.progress)
|
||||
@@ -205,15 +207,25 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
|
||||
self.requestTask.set(task: dataTask)
|
||||
|
||||
self.apiConfiguration.interceptor.willSendRequest(urlRequest: modifiedRequest, urlSession: urlSession, requestBuilder: self)
|
||||
|
||||
dataTask.resume()
|
||||
|
||||
case .failure(let error):
|
||||
self.apiConfiguration.interceptor.didComplete(urlRequest: request, urlSession: urlSession, requestBuilder: self, data: nil, response: nil, result: .failure(error))
|
||||
self.apiConfiguration.apiResponseQueue.async {
|
||||
completion(.failure(ErrorResponse.error(415, nil, nil, error)))
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Request creation failed - create a minimal request for error reporting
|
||||
let failedURL = URL(string: URLString) ?? URL(string: "about:blank")!
|
||||
var failedRequest = URLRequest(url: failedURL)
|
||||
failedRequest.httpMethod = method
|
||||
|
||||
self.apiConfiguration.interceptor.didComplete(urlRequest: failedRequest, urlSession: urlSession, requestBuilder: self, data: nil, response: nil, result: .failure(error))
|
||||
|
||||
self.apiConfiguration.apiResponseQueue.async {
|
||||
completion(.failure(ErrorResponse.error(415, nil, nil, error)))
|
||||
}
|
||||
@@ -235,6 +247,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
self.execute(completion: completion)
|
||||
|
||||
case .dontRetry:
|
||||
self.apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: response, result: .failure(error))
|
||||
self.apiConfiguration.apiResponseQueue.async {
|
||||
completion(.failure(ErrorResponse.error(statusCode, data, response, error)))
|
||||
}
|
||||
@@ -242,12 +255,13 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
}
|
||||
}
|
||||
|
||||
fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @escaping (_ result: Swift.Result<Response<T>, ErrorResponse>) -> Void) {
|
||||
fileprivate func processRequestResponse(urlRequest: URLRequest, urlSession: URLSessionProtocol, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @Sendable @escaping (_ result: Swift.Result<Response<T>, ErrorResponse>) -> Void) {
|
||||
|
||||
switch T.self {
|
||||
case is Void.Type:
|
||||
|
||||
completion(.success(Response(response: httpResponse, body: () as! T, bodyData: data)))
|
||||
let result = () as! T
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(result))
|
||||
completion(.success(Response(response: httpResponse, body: result, bodyData: data)))
|
||||
|
||||
default:
|
||||
fatalError("Unsupported Response Body Type - \(String(describing: T.self))")
|
||||
@@ -319,19 +333,17 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionDecodableRequestBuilder<T: Decodable>: URLSessionRequestBuilder<T>, @unchecked Sendable {
|
||||
override fileprivate func processRequestResponse(urlRequest: URLRequest, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @escaping (_ result: Swift.Result<Response<T>, ErrorResponse>) -> Void) {
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class URLSessionDecodableRequestBuilder<T: Decodable & Sendable>: URLSessionRequestBuilder<T>, @unchecked Sendable {
|
||||
override fileprivate func processRequestResponse(urlRequest: URLRequest, urlSession: URLSessionProtocol, data: Data?, httpResponse: HTTPURLResponse, error: Error?, completion: @Sendable @escaping (_ result: Swift.Result<Response<T>, ErrorResponse>) -> Void) {
|
||||
|
||||
switch T.self {
|
||||
case is String.Type:
|
||||
|
||||
let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? ""
|
||||
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(body as! T))
|
||||
completion(.success(Response<T>(response: httpResponse, body: body as! T, bodyData: data)))
|
||||
|
||||
case is URL.Type:
|
||||
do {
|
||||
|
||||
guard error == nil else {
|
||||
throw DownloadException.responseFailed
|
||||
}
|
||||
@@ -358,29 +370,37 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
try fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)
|
||||
try data.write(to: filePath, options: .atomic)
|
||||
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(filePath as! T))
|
||||
completion(.success(Response(response: httpResponse, body: filePath as! T, bodyData: data)))
|
||||
|
||||
} catch let requestParserError as DownloadException {
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .failure(requestParserError))
|
||||
completion(.failure(ErrorResponse.error(400, data, httpResponse, requestParserError)))
|
||||
} catch {
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .failure(error))
|
||||
completion(.failure(ErrorResponse.error(400, data, httpResponse, error)))
|
||||
}
|
||||
|
||||
case is Void.Type:
|
||||
|
||||
completion(.success(Response(response: httpResponse, body: () as! T, bodyData: data)))
|
||||
let result = () as! T
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(result))
|
||||
completion(.success(Response(response: httpResponse, body: result, bodyData: data)))
|
||||
|
||||
case is Data.Type:
|
||||
|
||||
completion(.success(Response(response: httpResponse, body: data as! T, bodyData: data)))
|
||||
let result = data as! T
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(result))
|
||||
completion(.success(Response(response: httpResponse, body: result, bodyData: data)))
|
||||
|
||||
default:
|
||||
|
||||
guard let unwrappedData = data, !unwrappedData.isEmpty else {
|
||||
if let expressibleByNilLiteralType = T.self as? ExpressibleByNilLiteral.Type {
|
||||
completion(.success(Response(response: httpResponse, body: expressibleByNilLiteralType.init(nilLiteral: ()) as! T, bodyData: data)))
|
||||
let result = expressibleByNilLiteralType.init(nilLiteral: ()) as! T
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: data, response: httpResponse, result: .success(result))
|
||||
completion(.success(Response(response: httpResponse, body: result, bodyData: data)))
|
||||
} else {
|
||||
completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, httpResponse, DecodableRequestBuilderError.emptyDataResponse)))
|
||||
let emptyDataError = DecodableRequestBuilderError.emptyDataResponse
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: nil, response: httpResponse, result: .failure(emptyDataError))
|
||||
completion(.failure(ErrorResponse.error(httpResponse.statusCode, nil, httpResponse, emptyDataError)))
|
||||
}
|
||||
return
|
||||
}
|
||||
@@ -389,8 +409,10 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
|
||||
switch decodeResult {
|
||||
case let .success(decodableObj):
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: unwrappedData, response: httpResponse, result: .success(decodableObj))
|
||||
completion(.success(Response(response: httpResponse, body: decodableObj, bodyData: unwrappedData)))
|
||||
case let .failure(error):
|
||||
apiConfiguration.interceptor.didComplete(urlRequest: urlRequest, urlSession: urlSession, requestBuilder: self, data: unwrappedData, response: httpResponse, result: .failure(error))
|
||||
completion(.failure(ErrorResponse.error(httpResponse.statusCode, unwrappedData, httpResponse, error)))
|
||||
}
|
||||
}
|
||||
@@ -398,7 +420,7 @@ fileprivate class URLSessionRequestBuilderConfiguration: @unchecked Sendable {
|
||||
}
|
||||
|
||||
fileprivate final class SessionDelegate: NSObject, URLSessionTaskDelegate {
|
||||
func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
|
||||
func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @Sendable @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
|
||||
|
||||
var disposition: URLSession.AuthChallengeDisposition = .performDefaultHandling
|
||||
|
||||
@@ -458,7 +480,7 @@ private class FormDataEncoding: ParameterEncoding {
|
||||
|
||||
let contentTypeForFormPart: (_ fileURL: URL) -> String?
|
||||
|
||||
init(contentTypeForFormPart: @escaping (_ fileURL: URL) -> String?) {
|
||||
init(contentTypeForFormPart: @Sendable @escaping (_ fileURL: URL) -> String?) {
|
||||
self.contentTypeForFormPart = contentTypeForFormPart
|
||||
}
|
||||
|
||||
@@ -711,20 +733,48 @@ extension JSONDataEncoding: ParameterEncoding {}
|
||||
case dontRetry
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} protocol OpenAPIInterceptor {
|
||||
func intercept<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, completion: @escaping (Result<URLRequest, Error>) -> Void)
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} protocol OpenAPIInterceptor: Sendable {
|
||||
// MARK: - Request Modification & Retry
|
||||
|
||||
func retry<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void)
|
||||
/// Called before the request is sent. Allows modifying the URLRequest (e.g., adding authentication headers).
|
||||
func intercept<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, completion: @Sendable @escaping (Result<URLRequest, Error>) -> Void)
|
||||
|
||||
/// Called when a request fails. Allows the interceptor to decide whether to retry the request.
|
||||
func retry<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error, completion: @Sendable @escaping (OpenAPIInterceptorRetry) -> Void)
|
||||
|
||||
// MARK: - Lifecycle Hooks
|
||||
|
||||
/// Called right before the request is sent, after all modifications from `intercept()` have been applied.
|
||||
/// Useful for logging the final request that will be sent.
|
||||
func willSendRequest<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>)
|
||||
|
||||
/// Called when the raw response is received, before any processing or decoding.
|
||||
/// Useful for logging raw responses or performing custom validation.
|
||||
func didReceiveResponse<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error?)
|
||||
|
||||
/// Called after the request completes (either success or failure).
|
||||
/// Useful for cleanup, analytics, or performance monitoring.
|
||||
func didComplete<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, result: Result<T, Error>)
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class DefaultOpenAPIInterceptor: OpenAPIInterceptor {
|
||||
// MARK: - Default Implementations (No-op)
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} extension OpenAPIInterceptor {
|
||||
func willSendRequest<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>) {}
|
||||
|
||||
func didReceiveResponse<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error?) {}
|
||||
|
||||
func didComplete<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, result: Result<T, Error>) {}
|
||||
}
|
||||
|
||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} final class DefaultOpenAPIInterceptor: OpenAPIInterceptor {
|
||||
public init() {}
|
||||
|
||||
public func intercept<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, completion: @escaping (Result<URLRequest, any Error>) -> Void) {
|
||||
|
||||
public func intercept<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, completion: @Sendable @escaping (Result<URLRequest, any Error>) -> Void) {
|
||||
completion(.success(urlRequest))
|
||||
}
|
||||
|
||||
public func retry<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error, completion: @escaping (OpenAPIInterceptorRetry) -> Void) {
|
||||
|
||||
public func retry<T>(urlRequest: URLRequest, urlSession: URLSessionProtocol, requestBuilder: RequestBuilder<T>, data: Data?, response: URLResponse?, error: Error, completion: @Sendable @escaping (OpenAPIInterceptorRetry) -> Void) {
|
||||
completion(.dontRetry)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,5 @@ extension {{projectName}}API {
|
||||
{{#swiftUseApiNamespace}}
|
||||
}
|
||||
{{/swiftUseApiNamespace}}{{#models}}{{#model}}{{#vendorExtensions.x-swift-identifiable}}
|
||||
@available(iOS 13, tvOS 13, watchOS 6, macOS 10.15, *)
|
||||
extension {{#swiftUseApiNamespace}}{{projectName}}API.{{/swiftUseApiNamespace}}{{{classname}}}: Identifiable {}
|
||||
{{/vendorExtensions.x-swift-identifiable}}{{/model}}{{/models}}
|
||||
@@ -1,5 +1,5 @@
|
||||
{{^objcCompatible}}{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} {{#useClasses}}final class{{/useClasses}}{{^useClasses}}struct{{/useClasses}} {{{classname}}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}@unchecked Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable{{/useVapor}}{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}} {
|
||||
{{/objcCompatible}}{{#objcCompatible}}@objcMembers {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} class {{classname}}: NSObject, Codable {
|
||||
{{/objcCompatible}}{{#objcCompatible}}@objcMembers {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} final class {{classname}}: NSObject, Codable, @unchecked Sendable {
|
||||
{{/objcCompatible}}
|
||||
|
||||
{{#allVars}}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { HttpHeaders, HttpParams, HttpParameterCodec } from '@angular/common/http';
|
||||
import { HttpHeaders, HttpParameterCodec } from '@angular/common/http';
|
||||
import { Param } from './param';
|
||||
import { OpenApiHttpParams } from './query.params';
|
||||
|
||||
export interface {{configurationParametersInterfaceName}} {
|
||||
/**
|
||||
@@ -198,7 +199,7 @@ constructor({ accessToken, apiKeys, basePath, credentials, encodeParam, encoder,
|
||||
: headers;
|
||||
}
|
||||
|
||||
public addCredentialToQuery(credentialKey: string, paramName: string, query: HttpParams): HttpParams {
|
||||
public addCredentialToQuery(credentialKey: string, paramName: string, query: OpenApiHttpParams): OpenApiHttpParams {
|
||||
const value = this.lookupCredential(credentialKey);
|
||||
return value
|
||||
? query.set(paramName, value)
|
||||
|
||||
@@ -42,6 +42,19 @@ export interface {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterIn
|
||||
*/
|
||||
export interface {{classname}}Interface {
|
||||
{{#operation}}
|
||||
/**
|
||||
* Creates request options for {{nickname}} without sending the request
|
||||
{{#allParams}}
|
||||
* @param {{=<% %>=}}{<%&dataType%>}<%={{ }}=%> {{^required}}[{{/required}}{{paramName}}{{^required}}]{{/required}} {{description}}
|
||||
{{/allParams}}
|
||||
{{#isDeprecated}}
|
||||
* @deprecated
|
||||
{{/isDeprecated}}
|
||||
* @throws {RequiredError}
|
||||
* @memberof {{classname}}Interface
|
||||
*/
|
||||
{{nickname}}RequestOpts({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request{{/allParams.0}}): Promise<runtime.RequestOpts>;
|
||||
|
||||
/**
|
||||
* {{¬es}}
|
||||
{{#summary}}
|
||||
@@ -95,17 +108,12 @@ export class {{classname}} extends runtime.BaseAPI {
|
||||
|
||||
{{#operation}}
|
||||
/**
|
||||
{{#notes}}
|
||||
* {{¬es}}
|
||||
{{/notes}}
|
||||
{{#summary}}
|
||||
* {{&summary}}
|
||||
{{/summary}}
|
||||
* Creates request options for {{nickname}} without sending the request
|
||||
{{#isDeprecated}}
|
||||
* @deprecated
|
||||
{{/isDeprecated}}
|
||||
*/
|
||||
async {{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
|
||||
async {{nickname}}RequestOpts({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request{{/allParams.0}}): Promise<runtime.RequestOpts> {
|
||||
{{#allParams}}
|
||||
{{#required}}
|
||||
if (requestParameters['{{paramName}}'] == null) {
|
||||
@@ -304,7 +312,7 @@ export class {{classname}} extends runtime.BaseAPI {
|
||||
{{/isDateTimeType}}
|
||||
{{/pathParams}}
|
||||
|
||||
const response = await this.request({
|
||||
return {
|
||||
path: urlPath,
|
||||
method: '{{httpMethod}}',
|
||||
headers: headerParameters,
|
||||
@@ -337,7 +345,23 @@ export class {{classname}} extends runtime.BaseAPI {
|
||||
{{#hasFormParams}}
|
||||
body: formParams,
|
||||
{{/hasFormParams}}
|
||||
}, initOverrides);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
{{#notes}}
|
||||
* {{¬es}}
|
||||
{{/notes}}
|
||||
{{#summary}}
|
||||
* {{&summary}}
|
||||
{{/summary}}
|
||||
{{#isDeprecated}}
|
||||
* @deprecated
|
||||
{{/isDeprecated}}
|
||||
*/
|
||||
async {{nickname}}Raw({{#allParams.0}}requestParameters: {{#prefixParameterInterfaces}}{{classname}}{{/prefixParameterInterfaces}}{{operationIdCamelCase}}Request, {{/allParams.0}}initOverrides?: RequestInit | runtime.InitOverrideFunction): Promise<runtime.ApiResponse<{{{returnType}}}{{^returnType}}void{{/returnType}}>> {
|
||||
const requestOptions = await this.{{nickname}}RequestOpts({{#allParams.0}}requestParameters{{/allParams.0}});
|
||||
const response = await this.request(requestOptions, initOverrides);
|
||||
|
||||
{{#returnType}}
|
||||
{{#isResponseFile}}
|
||||
|
||||
@@ -671,6 +671,32 @@ public class DefaultGeneratorTest {
|
||||
Assert.assertEquals(servers.get(2).url, "http://notrailingslash.io:80/v2");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHandlesRelativeUrlsWithSpecialChars() {
|
||||
final Map<String, String> specToBasePath = Map.of(
|
||||
"src/test/resources/3_0/relative-url-point.yaml", "/api/v4.0",
|
||||
"src/test/resources/3_0/relative-url-dash.yaml", "/api-v3",
|
||||
"src/test/resources/3_0/relative-url-tilde.yaml", "/~api/v5",
|
||||
"src/test/resources/3_0/relative-url-at.yaml", "/api/@6"
|
||||
);
|
||||
|
||||
specToBasePath.forEach((spec, expectedBasePath) -> {
|
||||
OpenAPI openAPI = TestUtils.parseFlattenSpec(spec);
|
||||
ClientOptInput opts = new ClientOptInput();
|
||||
opts.openAPI(openAPI);
|
||||
DefaultCodegen config = new DefaultCodegen();
|
||||
config.setStrictSpecBehavior(false);
|
||||
opts.config(config);
|
||||
final DefaultGenerator generator = new DefaultGenerator();
|
||||
generator.opts(opts);
|
||||
generator.configureGeneratorProperties();
|
||||
|
||||
Map<String, Object> bundle = generator.buildSupportFileBundle(new ArrayList<>(), new ArrayList<>(), new ArrayList<>());
|
||||
final String actualBasePath = (String) bundle.get("basePath");
|
||||
Assert.assertEquals(actualBasePath, expectedBasePath);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHandlesRelativeUrlsInServers() {
|
||||
OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/issue_10056.yaml");
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
openapi: 3.0.1
|
||||
info:
|
||||
title: OpenAPI Petstore
|
||||
description: "sample spec"
|
||||
license:
|
||||
name: Apache-2.0
|
||||
url: https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: /api/@6
|
||||
tags: []
|
||||
paths: {}
|
||||
components:
|
||||
schemas: {}
|
||||
securitySchemes: {}
|
||||
@@ -0,0 +1,15 @@
|
||||
openapi: 3.0.1
|
||||
info:
|
||||
title: OpenAPI Petstore
|
||||
description: "sample spec"
|
||||
license:
|
||||
name: Apache-2.0
|
||||
url: https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: /api-v3
|
||||
tags: []
|
||||
paths: {}
|
||||
components:
|
||||
schemas: {}
|
||||
securitySchemes: {}
|
||||
@@ -0,0 +1,15 @@
|
||||
openapi: 3.0.1
|
||||
info:
|
||||
title: OpenAPI Petstore
|
||||
description: "sample spec"
|
||||
license:
|
||||
name: Apache-2.0
|
||||
url: https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: /api/v4.0
|
||||
tags: []
|
||||
paths: {}
|
||||
components:
|
||||
schemas: {}
|
||||
securitySchemes: {}
|
||||
@@ -0,0 +1,15 @@
|
||||
openapi: 3.0.1
|
||||
info:
|
||||
title: OpenAPI Petstore
|
||||
description: "sample spec"
|
||||
license:
|
||||
name: Apache-2.0
|
||||
url: https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
version: 1.0.0
|
||||
servers:
|
||||
- url: /~api/v5
|
||||
tags: []
|
||||
paths: {}
|
||||
components:
|
||||
schemas: {}
|
||||
securitySchemes: {}
|
||||
2
pom.xml
2
pom.xml
@@ -15,7 +15,7 @@
|
||||
<packaging>pom</packaging>
|
||||
<name>openapi-generator-project</name>
|
||||
<!-- RELEASE_VERSION -->
|
||||
<version>7.19.0</version>
|
||||
<version>7.20.0-SNAPSHOT</version>
|
||||
<!-- /RELEASE_VERSION -->
|
||||
<url>https://github.com/openapitools/openapi-generator</url>
|
||||
<scm>
|
||||
|
||||
@@ -1 +1 @@
|
||||
7.19.0-SNAPSHOT
|
||||
7.20.0-SNAPSHOT
|
||||
|
||||
@@ -6,7 +6,7 @@ This C# SDK is automatically generated by the [OpenAPI Generator](https://openap
|
||||
|
||||
- API version: 0.1.0
|
||||
- SDK version: 1.0.0
|
||||
- Generator version: 7.19.0-SNAPSHOT
|
||||
- Generator version: 7.20.0-SNAPSHOT
|
||||
- Build package: org.openapitools.codegen.languages.CSharpClientCodegen
|
||||
|
||||
<a id="frameworks-supported"></a>
|
||||
|
||||
@@ -1 +1 @@
|
||||
7.19.0-SNAPSHOT
|
||||
7.20.0-SNAPSHOT
|
||||
|
||||
@@ -7,7 +7,7 @@ This API client was generated by the [OpenAPI Generator](https://openapi-generat
|
||||
|
||||
- API version: 0.1.0
|
||||
- Package version: 1.0.0
|
||||
- Generator version: 7.19.0-SNAPSHOT
|
||||
- Generator version: 7.20.0-SNAPSHOT
|
||||
- Build package: org.openapitools.codegen.languages.GoClientCodegen
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -1 +1 @@
|
||||
7.19.0-SNAPSHOT
|
||||
7.20.0-SNAPSHOT
|
||||
|
||||
@@ -7,7 +7,7 @@ This API client was generated by the [OpenAPI Generator](https://openapi-generat
|
||||
|
||||
- API version: 0.1.0
|
||||
- Package version: 1.0.0
|
||||
- Generator version: 7.19.0-SNAPSHOT
|
||||
- Generator version: 7.20.0-SNAPSHOT
|
||||
- Build package: org.openapitools.codegen.languages.GoClientCodegen
|
||||
|
||||
## Installation
|
||||
|
||||
@@ -1 +1 @@
|
||||
7.19.0-SNAPSHOT
|
||||
7.20.0-SNAPSHOT
|
||||
|
||||
@@ -4,7 +4,7 @@ Echo Server API
|
||||
|
||||
- API version: 0.1.0
|
||||
|
||||
- Generator version: 7.19.0-SNAPSHOT
|
||||
- Generator version: 7.20.0-SNAPSHOT
|
||||
|
||||
Echo Server API
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ import org.openapitools.client.auth.Authentication;
|
||||
import org.openapitools.client.auth.HttpBasicAuth;
|
||||
import org.openapitools.client.auth.HttpBearerAuth;
|
||||
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public class ApiClient extends JavaTimeFormatter {
|
||||
protected Map<String, String> defaultHeaderMap = new HashMap<String, String>();
|
||||
protected Map<String, String> defaultCookieMap = new HashMap<String, String>();
|
||||
|
||||
@@ -16,7 +16,7 @@ package org.openapitools.client;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public class ApiException extends Exception {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public abstract class BaseApi {
|
||||
|
||||
protected ApiClient apiClient;
|
||||
|
||||
@@ -17,7 +17,7 @@ import java.util.Objects;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public class Configuration {
|
||||
public static final String VERSION = "0.1.0";
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ import java.time.format.DateTimeParseException;
|
||||
* Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
|
||||
* It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
|
||||
*/
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public class JavaTimeFormatter {
|
||||
private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
|
||||
package org.openapitools.client;
|
||||
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.19.0-SNAPSHOT")
|
||||
@javax.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.20.0-SNAPSHOT")
|
||||
public class Pair {
|
||||
private final String name;
|
||||
private final String value;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user