mirror of
https://github.com/OpenAPITools/openapi-generator.git
synced 2025-12-06 00:06:16 +00:00
Feature/kotlin/library/retrofit (#4518)
* Some clean code. * Add support for retrofit2 in models and apis. Need work in ApiClient, but it's not urgent. * Add ApiClient with retrofit2 support. * Remove unnecessary package. * Add scripts to generate samples. * Generate sample of retrofit2 * Change toUpperCase to toUpperCase(Locale.ROOT) to fix compile. * Added GSON library when it's needed * Fix typo. * Add some missing common files. * Execute bin script. * Remove copy&paste error in script. * [kotlin] update outdated files * Fix apis with no params. * Add missing import in ApiClient * Add support for CSV, SSV, TSV, PIPES, SPACES in retrofit 2 library. * Fix package name. * Execute kotlin-client-retrofit2.sh script. * force rebuild. * execute script again. * Add missing imports from okhttp3. @Deprecated has a message param that java not. Add it with a default message. * Execute retrofit2 script. * Rerun script.
This commit is contained in:
committed by
William Cheng
parent
789f1a06f0
commit
bb4af91bbd
@@ -29,6 +29,7 @@ import org.openapitools.codegen.SupportingFile;
|
||||
import java.io.File;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
@@ -38,6 +39,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
|
||||
protected static final String JVM = "jvm";
|
||||
protected static final String JVM_OKHTTP4 = "jvm-okhttp4";
|
||||
protected static final String JVM_OKHTTP3 = "jvm-okhttp3";
|
||||
protected static final String RETROFIT2 = "retrofit2";
|
||||
protected static final String MULTIPLATFORM = "multiplatform";
|
||||
|
||||
public static final String DATE_LIBRARY = "dateLibrary";
|
||||
@@ -112,6 +114,7 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
|
||||
|
||||
supportedLibraries.put(JVM_OKHTTP4, "[DEFAULT] Platform: Java Virtual Machine. HTTP client: OkHttp 4.2.0 (Android 5.0+ and Java 8+). JSON processing: Moshi 1.8.0.");
|
||||
supportedLibraries.put(JVM_OKHTTP3, "Platform: Java Virtual Machine. HTTP client: OkHttp 3.12.4 (Android 2.3+ and Java 7+). JSON processing: Moshi 1.8.0.");
|
||||
supportedLibraries.put(RETROFIT2, "Platform: Java Virtual Machine. HTTP client: Retrofit 2.6.2.");
|
||||
supportedLibraries.put(MULTIPLATFORM, "Platform: Kotlin multiplatform. HTTP client: Ktor 1.2.4. JSON processing: Kotlinx Serialization: 0.12.0.");
|
||||
|
||||
CliOption libraryOption = new CliOption(CodegenConstants.LIBRARY, "Library template (sub-template) to use");
|
||||
@@ -157,115 +160,24 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
|
||||
setDateLibrary(additionalProperties.get(DATE_LIBRARY).toString());
|
||||
}
|
||||
|
||||
// common (jvm/multiplatform) supporting files
|
||||
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
|
||||
supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle"));
|
||||
supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiClient.kt.mustache", infrastructureFolder, "ApiClient.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiAbstractions.kt.mustache", infrastructureFolder, "ApiAbstractions.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/RequestConfig.kt.mustache", infrastructureFolder, "RequestConfig.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/RequestMethod.kt.mustache", infrastructureFolder, "RequestMethod.kt"));
|
||||
commonSupportingFiles();
|
||||
|
||||
if (isJVMLibrary()) {
|
||||
additionalProperties.put(JVM, true);
|
||||
|
||||
if (JVM_OKHTTP4.equals(getLibrary())) {
|
||||
additionalProperties.put(JVM_OKHTTP4, true);
|
||||
} else if (JVM_OKHTTP3.equals(getLibrary())) {
|
||||
additionalProperties.put(JVM_OKHTTP3, true);
|
||||
}
|
||||
|
||||
supportedLibraries.put(JVM, "A workaround to use the same template folder for both 'jvm-okhttp3' and 'jvm-okhttp4'.");
|
||||
setLibrary(JVM);
|
||||
|
||||
// jvm specific supporting files
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApplicationDelegates.kt.mustache", infrastructureFolder, "ApplicationDelegates.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Errors.kt.mustache", infrastructureFolder, "Errors.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ResponseExtensions.kt.mustache", infrastructureFolder, "ResponseExtensions.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Serializer.kt.mustache", infrastructureFolder, "Serializer.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiInfrastructureResponse.kt.mustache", infrastructureFolder, "ApiInfrastructureResponse.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ByteArrayAdapter.kt.mustache", infrastructureFolder, "ByteArrayAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/LocalDateAdapter.kt.mustache", infrastructureFolder, "LocalDateAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/LocalDateTimeAdapter.kt.mustache", infrastructureFolder, "LocalDateTimeAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/UUIDAdapter.kt.mustache", infrastructureFolder, "UUIDAdapter.kt"));
|
||||
if (getSerializationLibrary() == SERIALIZATION_LIBRARY_TYPE.gson) {
|
||||
supportingFiles.add(new SupportingFile("infrastructure/DateAdapter.kt.mustache", infrastructureFolder,
|
||||
"DateAdapter.kt"));
|
||||
}
|
||||
|
||||
} else if (MULTIPLATFORM.equals(getLibrary())) {
|
||||
additionalProperties.put(MULTIPLATFORM, true);
|
||||
setDateLibrary(DateLibrary.STRING.value);
|
||||
|
||||
// multiplatform default includes
|
||||
defaultIncludes.add("io.ktor.client.request.forms.InputProvider");
|
||||
defaultIncludes.add(packageName + ".infrastructure.Base64ByteArray");
|
||||
defaultIncludes.add(packageName + ".infrastructure.OctetByteArray");
|
||||
|
||||
// multiplatform type mapping
|
||||
typeMapping.put("number", "kotlin.Double");
|
||||
typeMapping.put("file", "OctetByteArray");
|
||||
typeMapping.put("binary", "OctetByteArray");
|
||||
typeMapping.put("ByteArray", "Base64ByteArray");
|
||||
typeMapping.put("object", "kotlin.String"); // kotlin.Any not serializable
|
||||
|
||||
// multiplatform import mapping
|
||||
importMapping.put("BigDecimal", "kotlin.Double");
|
||||
importMapping.put("UUID", "kotlin.String");
|
||||
importMapping.put("URI", "kotlin.String");
|
||||
importMapping.put("InputProvider", "io.ktor.client.request.forms.InputProvider");
|
||||
importMapping.put("File", packageName + ".infrastructure.OctetByteArray");
|
||||
importMapping.put("Timestamp", "kotlin.String");
|
||||
importMapping.put("LocalDateTime", "kotlin.String");
|
||||
importMapping.put("LocalDate", "kotlin.String");
|
||||
importMapping.put("LocalTime", "kotlin.String");
|
||||
importMapping.put("Base64ByteArray", packageName + ".infrastructure.Base64ByteArray");
|
||||
importMapping.put("OctetByteArray", packageName + ".infrastructure.OctetByteArray");
|
||||
|
||||
// multiplatform specific supporting files
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Base64ByteArray.kt.mustache", infrastructureFolder, "Base64ByteArray.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Bytes.kt.mustache", infrastructureFolder, "Bytes.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/HttpResponse.kt.mustache", infrastructureFolder, "HttpResponse.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/OctetByteArray.kt.mustache", infrastructureFolder, "OctetByteArray.kt"));
|
||||
|
||||
// multiplatform specific auth
|
||||
final String authFolder = (sourceFolder + File.separator + packageName + File.separator + "auth").replace(".", "/");
|
||||
supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.kt.mustache", authFolder, "ApiKeyAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/Authentication.kt.mustache", authFolder, "Authentication.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.kt.mustache", authFolder, "HttpBasicAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/HttpBearerAuth.kt.mustache", authFolder, "HttpBearerAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/OAuth.kt.mustache", authFolder, "OAuth.kt"));
|
||||
|
||||
// multiplatform specific testing files
|
||||
supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "src/commonTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "src/iosTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "src/jsTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "src/jvmTest/kotlin/util", "Coroutine.kt"));
|
||||
|
||||
// gradle wrapper supporting files
|
||||
supportingFiles.add(new SupportingFile("gradlew.mustache", "", "gradlew"));
|
||||
supportingFiles.add(new SupportingFile("gradlew.bat.mustache", "", "gradlew.bat"));
|
||||
supportingFiles.add(new SupportingFile("gradle-wrapper.properties.mustache", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.properties"));
|
||||
supportingFiles.add(new SupportingFile("gradle-wrapper.jar", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.jar"));
|
||||
switch (getLibrary()) {
|
||||
case JVM_OKHTTP3:
|
||||
case JVM_OKHTTP4:
|
||||
processJVMLibrary(infrastructureFolder);
|
||||
break;
|
||||
case RETROFIT2:
|
||||
processRetrofit2Library(infrastructureFolder);
|
||||
break;
|
||||
case MULTIPLATFORM:
|
||||
processMultiplatformLibrary(infrastructureFolder);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// date library processing
|
||||
if (DateLibrary.THREETENBP.value.equals(dateLibrary)) {
|
||||
additionalProperties.put(DateLibrary.THREETENBP.value, true);
|
||||
typeMapping.put("date", "LocalDate");
|
||||
typeMapping.put("DateTime", "LocalDateTime");
|
||||
importMapping.put("LocalDate", "org.threeten.bp.LocalDate");
|
||||
importMapping.put("LocalDateTime", "org.threeten.bp.LocalDateTime");
|
||||
defaultIncludes.add("org.threeten.bp.LocalDate");
|
||||
defaultIncludes.add("org.threeten.bp.LocalDateTime");
|
||||
} else if (DateLibrary.STRING.value.equals(dateLibrary)) {
|
||||
typeMapping.put("date-time", "kotlin.String");
|
||||
typeMapping.put("date", "kotlin.String");
|
||||
typeMapping.put("Date", "kotlin.String");
|
||||
typeMapping.put("DateTime", "kotlin.String");
|
||||
} else if (DateLibrary.JAVA8.value.equals(dateLibrary)) {
|
||||
additionalProperties.put(DateLibrary.JAVA8.value, true);
|
||||
}
|
||||
processDateLibrary();
|
||||
|
||||
if (additionalProperties.containsKey(COLLECTION_TYPE)) {
|
||||
setCollectionType(additionalProperties.get(COLLECTION_TYPE).toString());
|
||||
@@ -276,11 +188,157 @@ public class KotlinClientCodegen extends AbstractKotlinCodegen {
|
||||
typeMapping.put("list", "kotlin.collections.List");
|
||||
additionalProperties.put("isList", true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private boolean isJVMLibrary() {
|
||||
return getLibrary() != null && (getLibrary().contains(JVM_OKHTTP4) || getLibrary().contains(JVM_OKHTTP3));
|
||||
private void processDateLibrary() {
|
||||
DateLibrary dateLibraryEnum = DateLibrary.valueOf(dateLibrary.toUpperCase(Locale.ROOT));
|
||||
switch (dateLibraryEnum) {
|
||||
case THREETENBP:
|
||||
processThreeTeBpDate();
|
||||
break;
|
||||
case STRING:
|
||||
processStringDate();
|
||||
break;
|
||||
case JAVA8:
|
||||
processJava8Date();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void processThreeTeBpDate() {
|
||||
additionalProperties.put(DateLibrary.THREETENBP.value, true);
|
||||
typeMapping.put("date", "LocalDate");
|
||||
typeMapping.put("DateTime", "LocalDateTime");
|
||||
importMapping.put("LocalDate", "org.threeten.bp.LocalDate");
|
||||
importMapping.put("LocalDateTime", "org.threeten.bp.LocalDateTime");
|
||||
defaultIncludes.add("org.threeten.bp.LocalDate");
|
||||
defaultIncludes.add("org.threeten.bp.LocalDateTime");
|
||||
}
|
||||
|
||||
private void processStringDate() {
|
||||
typeMapping.put("date-time", "kotlin.String");
|
||||
typeMapping.put("date", "kotlin.String");
|
||||
typeMapping.put("Date", "kotlin.String");
|
||||
typeMapping.put("DateTime", "kotlin.String");
|
||||
}
|
||||
|
||||
private void processJava8Date() {
|
||||
additionalProperties.put(DateLibrary.JAVA8.value, true);
|
||||
}
|
||||
|
||||
private void processRetrofit2Library(String infrastructureFolder) {
|
||||
additionalProperties.put(RETROFIT2, true);
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiClient.kt.mustache", infrastructureFolder, "ApiClient.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/CollectionFormats.kt.mustache", infrastructureFolder, "CollectionFormats.kt"));
|
||||
addSupportingSerializerAdapters(infrastructureFolder);
|
||||
}
|
||||
|
||||
private void addSupportingSerializerAdapters(final String infrastructureFolder) {
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Serializer.kt.mustache", infrastructureFolder, "Serializer.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ByteArrayAdapter.kt.mustache", infrastructureFolder, "ByteArrayAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/LocalDateAdapter.kt.mustache", infrastructureFolder, "LocalDateAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/LocalDateTimeAdapter.kt.mustache", infrastructureFolder, "LocalDateTimeAdapter.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/UUIDAdapter.kt.mustache", infrastructureFolder, "UUIDAdapter.kt"));
|
||||
|
||||
if (getSerializationLibrary() == SERIALIZATION_LIBRARY_TYPE.gson) {
|
||||
supportingFiles.add(new SupportingFile("infrastructure/DateAdapter.kt.mustache", infrastructureFolder,
|
||||
"DateAdapter.kt"));
|
||||
}
|
||||
}
|
||||
|
||||
private void processJVMLibrary(final String infrastructureFolder) {
|
||||
commonJvmMultiplatformSupportingFiles(infrastructureFolder);
|
||||
addSupportingSerializerAdapters(infrastructureFolder);
|
||||
|
||||
additionalProperties.put(JVM, true);
|
||||
|
||||
if (JVM_OKHTTP4.equals(getLibrary())) {
|
||||
additionalProperties.put(JVM_OKHTTP4, true);
|
||||
} else if (JVM_OKHTTP3.equals(getLibrary())) {
|
||||
additionalProperties.put(JVM_OKHTTP3, true);
|
||||
}
|
||||
|
||||
supportedLibraries.put(JVM, "A workaround to use the same template folder for both 'jvm-okhttp3' and 'jvm-okhttp4'.");
|
||||
setLibrary(JVM);
|
||||
|
||||
// jvm specific supporting files
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApplicationDelegates.kt.mustache", infrastructureFolder, "ApplicationDelegates.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Errors.kt.mustache", infrastructureFolder, "Errors.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ResponseExtensions.kt.mustache", infrastructureFolder, "ResponseExtensions.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiInfrastructureResponse.kt.mustache", infrastructureFolder, "ApiInfrastructureResponse.kt"));
|
||||
}
|
||||
|
||||
private void processMultiplatformLibrary(final String infrastructureFolder) {
|
||||
commonJvmMultiplatformSupportingFiles(infrastructureFolder);
|
||||
additionalProperties.put(MULTIPLATFORM, true);
|
||||
setDateLibrary(DateLibrary.STRING.value);
|
||||
|
||||
// multiplatform default includes
|
||||
defaultIncludes.add("io.ktor.client.request.forms.InputProvider");
|
||||
defaultIncludes.add(packageName + ".infrastructure.Base64ByteArray");
|
||||
defaultIncludes.add(packageName + ".infrastructure.OctetByteArray");
|
||||
|
||||
// multiplatform type mapping
|
||||
typeMapping.put("number", "kotlin.Double");
|
||||
typeMapping.put("file", "OctetByteArray");
|
||||
typeMapping.put("binary", "OctetByteArray");
|
||||
typeMapping.put("ByteArray", "Base64ByteArray");
|
||||
typeMapping.put("object", "kotlin.String"); // kotlin.Any not serializable
|
||||
|
||||
// multiplatform import mapping
|
||||
importMapping.put("BigDecimal", "kotlin.Double");
|
||||
importMapping.put("UUID", "kotlin.String");
|
||||
importMapping.put("URI", "kotlin.String");
|
||||
importMapping.put("InputProvider", "io.ktor.client.request.forms.InputProvider");
|
||||
importMapping.put("File", packageName + ".infrastructure.OctetByteArray");
|
||||
importMapping.put("Timestamp", "kotlin.String");
|
||||
importMapping.put("LocalDateTime", "kotlin.String");
|
||||
importMapping.put("LocalDate", "kotlin.String");
|
||||
importMapping.put("LocalTime", "kotlin.String");
|
||||
importMapping.put("Base64ByteArray", packageName + ".infrastructure.Base64ByteArray");
|
||||
importMapping.put("OctetByteArray", packageName + ".infrastructure.OctetByteArray");
|
||||
|
||||
// multiplatform specific supporting files
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Base64ByteArray.kt.mustache", infrastructureFolder, "Base64ByteArray.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/Bytes.kt.mustache", infrastructureFolder, "Bytes.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/HttpResponse.kt.mustache", infrastructureFolder, "HttpResponse.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/OctetByteArray.kt.mustache", infrastructureFolder, "OctetByteArray.kt"));
|
||||
|
||||
// multiplatform specific auth
|
||||
final String authFolder = (sourceFolder + File.separator + packageName + File.separator + "auth").replace(".", "/");
|
||||
supportingFiles.add(new SupportingFile("auth/ApiKeyAuth.kt.mustache", authFolder, "ApiKeyAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/Authentication.kt.mustache", authFolder, "Authentication.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/HttpBasicAuth.kt.mustache", authFolder, "HttpBasicAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/HttpBearerAuth.kt.mustache", authFolder, "HttpBearerAuth.kt"));
|
||||
supportingFiles.add(new SupportingFile("auth/OAuth.kt.mustache", authFolder, "OAuth.kt"));
|
||||
|
||||
// multiplatform specific testing files
|
||||
supportingFiles.add(new SupportingFile("commonTest/Coroutine.kt.mustache", "src/commonTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("iosTest/Coroutine.kt.mustache", "src/iosTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("jsTest/Coroutine.kt.mustache", "src/jsTest/kotlin/util", "Coroutine.kt"));
|
||||
supportingFiles.add(new SupportingFile("jvmTest/Coroutine.kt.mustache", "src/jvmTest/kotlin/util", "Coroutine.kt"));
|
||||
|
||||
// gradle wrapper supporting files
|
||||
supportingFiles.add(new SupportingFile("gradlew.mustache", "", "gradlew"));
|
||||
supportingFiles.add(new SupportingFile("gradlew.bat.mustache", "", "gradlew.bat"));
|
||||
supportingFiles.add(new SupportingFile("gradle-wrapper.properties.mustache", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.properties"));
|
||||
supportingFiles.add(new SupportingFile("gradle-wrapper.jar", "gradle.wrapper".replace(".", File.separator), "gradle-wrapper.jar"));
|
||||
}
|
||||
|
||||
|
||||
private void commonJvmMultiplatformSupportingFiles(String infrastructureFolder) {
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiClient.kt.mustache", infrastructureFolder, "ApiClient.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/ApiAbstractions.kt.mustache", infrastructureFolder, "ApiAbstractions.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/RequestConfig.kt.mustache", infrastructureFolder, "RequestConfig.kt"));
|
||||
supportingFiles.add(new SupportingFile("infrastructure/RequestMethod.kt.mustache", infrastructureFolder, "RequestMethod.kt"));
|
||||
}
|
||||
|
||||
private void commonSupportingFiles() {
|
||||
supportingFiles.add(new SupportingFile("README.mustache", "", "README.md"));
|
||||
supportingFiles.add(new SupportingFile("build.gradle.mustache", "", "build.gradle"));
|
||||
supportingFiles.add(new SupportingFile("settings.gradle.mustache", "", "settings.gradle"));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -8,6 +8,9 @@ wrapper {
|
||||
|
||||
buildscript {
|
||||
ext.kotlin_version = '1.3.61'
|
||||
{{#retrofit2}}
|
||||
ext.retrofitVersion = '2.6.2'
|
||||
{{/retrofit2}}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
@@ -38,10 +41,10 @@ dependencies {
|
||||
compile "com.squareup.moshi:moshi-kotlin:1.9.2"
|
||||
{{/moshiCodeGen}}
|
||||
compile "com.squareup.moshi:moshi-adapters:1.9.2"
|
||||
{{#moshiCodeGen}}
|
||||
{{#moshiCodeGen}}
|
||||
compile "com.squareup.moshi:moshi:1.9.2"
|
||||
kapt "com.squareup.moshi:moshi-kotlin-codegen:1.9.2"
|
||||
{{/moshiCodeGen}}
|
||||
{{/moshiCodeGen}}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
compile "com.google.code.gson:gson:2.8.6"
|
||||
@@ -55,5 +58,15 @@ dependencies {
|
||||
{{#threetenbp}}
|
||||
compile "org.threeten:threetenbp:1.4.0"
|
||||
{{/threetenbp}}
|
||||
{{#retrofit2}}
|
||||
compile "com.squareup.retrofit2:retrofit:$retrofitVersion"
|
||||
{{#gson}}
|
||||
compile "com.squareup.retrofit2:converter-gson:$retrofitVersion"
|
||||
{{/gson}}
|
||||
{{#moshi}}
|
||||
compile "com.squareup.retrofit2:converter-moshi:$retrofitVersion"
|
||||
{{/moshi}}
|
||||
compile "com.squareup.retrofit2:converter-scalars:$retrofitVersion"
|
||||
{{/retrofit2}}
|
||||
testCompile "io.kotlintest:kotlintest-runner-junit5:3.1.0"
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#gson}}
|
||||
import com.google.gson.annotations.SerializedName
|
||||
{{/gson}}
|
||||
@@ -13,7 +13,7 @@ import android.os.Parcelable
|
||||
import kotlinx.android.parcel.Parcelize
|
||||
|
||||
{{/parcelizeModels}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#multiplatform}}
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.internal.CommonEnumSerializer
|
||||
@@ -59,14 +59,14 @@ import java.io.Serializable
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{{nameInCamelCase}}}(val value: {{#isListContainer}}{{{ nestedType }}}{{/isListContainer}}{{^isListContainer}}{{{dataType}}}{{/isListContainer}}){
|
||||
{{#allowableValues}}
|
||||
{{#enumVars}}
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#moshi}}
|
||||
@Json(name = {{{value}}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
@SerializedName(value={{{value}}}) {{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
|
||||
{{/gson}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#multiplatform}}
|
||||
{{&name}}({{{value}}}){{^-last}},{{/-last}}{{#-last}};{{/-last}}
|
||||
{{/multiplatform}}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{{#description}}
|
||||
/* {{{description}}} */
|
||||
{{/description}}
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#moshi}}
|
||||
@Json(name = "{{{vendorExtensions.x-base-name-literal}}}")
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
@SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
|
||||
{{/gson}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") {{/multiplatform}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}? = {{#defaultvalue}}{{defaultvalue}}{{/defaultvalue}}{{^defaultvalue}}null{{/defaultvalue}}
|
||||
@@ -1,12 +1,12 @@
|
||||
{{#description}}
|
||||
/* {{{description}}} */
|
||||
{{/description}}
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#moshi}}
|
||||
@Json(name = "{{{vendorExtensions.x-base-name-literal}}}")
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
@SerializedName("{{{vendorExtensions.x-base-name-literal}}}")
|
||||
{{/gson}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#multiplatform}}@SerialName(value = "{{{vendorExtensions.x-base-name-literal}}}") @Required {{/multiplatform}}{{>modelMutable}} {{{name}}}: {{#isEnum}}{{#isListContainer}}{{#isList}}kotlin.collections.List{{/isList}}{{^isList}}kotlin.Array{{/isList}}<{{classname}}.{{{nameInCamelCase}}}>{{/isListContainer}}{{^isListContainer}}{{classname}}.{{{nameInCamelCase}}}{{/isListContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{#isNullable}}?{{/isNullable}}
|
||||
@@ -1,11 +1,11 @@
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#gson}}
|
||||
import com.google.gson.annotations.SerializedName
|
||||
{{/gson}}
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.Json
|
||||
{{/moshi}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#multiplatform}}
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.internal.CommonEnumSerializer
|
||||
@@ -19,14 +19,14 @@ import kotlinx.serialization.internal.CommonEnumSerializer
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}enum class {{classname}}(val value: {{{dataType}}}){
|
||||
|
||||
{{#allowableValues}}{{#enumVars}}
|
||||
{{#jvm}}
|
||||
{{^multiplatform}}
|
||||
{{#moshi}}
|
||||
@Json(name = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}})
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
@SerializedName(value = {{^isString}}"{{/isString}}{{{value}}}{{^isString}}"{{/isString}})
|
||||
{{/gson}}
|
||||
{{/jvm}}
|
||||
{{/multiplatform}}
|
||||
{{#isListContainer}}
|
||||
{{#isList}}
|
||||
{{&name}}(listOf({{{value}}})){{^-last}},{{/-last}}{{#-last}};{{/-last}}
|
||||
|
||||
38
modules/openapi-generator/src/main/resources/kotlin-client/libraries/retrofit2/api.mustache
vendored
Normal file
38
modules/openapi-generator/src/main/resources/kotlin-client/libraries/retrofit2/api.mustache
vendored
Normal file
@@ -0,0 +1,38 @@
|
||||
package {{apiPackage}}
|
||||
|
||||
import {{packageName}}.infrastructure.CollectionFormats.*
|
||||
import retrofit2.http.*
|
||||
import retrofit2.Call
|
||||
import okhttp3.RequestBody
|
||||
import okhttp3.ResponseBody
|
||||
import okhttp3.MultipartBody
|
||||
|
||||
{{#imports}}import {{import}}
|
||||
{{/imports}}
|
||||
|
||||
{{#operations}}
|
||||
interface {{classname}} {
|
||||
{{#operation}}
|
||||
{{#isDeprecated}}
|
||||
@Deprecated("This api was deprecated")
|
||||
{{/isDeprecated}}
|
||||
{{#formParams}}
|
||||
{{#-first}}
|
||||
{{#isMultipart}}@Multipart{{/isMultipart}}{{^isMultipart}}@FormUrlEncoded{{/isMultipart}}
|
||||
{{/-first}}
|
||||
{{/formParams}}
|
||||
{{^formParams}}
|
||||
{{#prioritizedContentTypes}}
|
||||
{{#-first}}
|
||||
@Headers({
|
||||
"Content-Type:{{{mediaType}}}"
|
||||
})
|
||||
{{/-first}}
|
||||
{{/prioritizedContentTypes}}
|
||||
{{/formParams}}
|
||||
@{{httpMethod}}("{{{path}}}")
|
||||
fun {{operationId}}({{^allParams}}){{/allParams}}{{#allParams}}{{>libraries/retrofit2/queryParams}}{{>libraries/retrofit2/pathParams}}{{>libraries/retrofit2/headerParams}}{{>libraries/retrofit2/bodyParams}}{{>libraries/retrofit2/formParams}}{{#hasMore}}, {{/hasMore}}{{^hasMore}}){{/hasMore}}{{/allParams}}: Call<{{#isResponseFile}}ResponseBody{{/isResponseFile}}{{^isResponseFile}}{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}Unit{{/returnType}}{{/isResponseFile}}>
|
||||
|
||||
{{/operation}}
|
||||
}
|
||||
{{/operations}}
|
||||
@@ -0,0 +1 @@
|
||||
{{#isBodyParam}}@Body {{paramName}}: {{{dataType}}}{{/isBodyParam}}
|
||||
@@ -0,0 +1 @@
|
||||
{{#isFormParam}}{{^isFile}}{{#isMultipart}}@Part{{/isMultipart}}{{^isMultipart}}@Field{{/isMultipart}}("{{baseName}}") {{paramName}}: {{{dataType}}}{{/isFile}}{{#isFile}}{{#isMultipart}}@Part{{/isMultipart}}{{^isMultipart}}@Field("{{baseName}}"){{/isMultipart}} {{paramName}}: MultipartBody.Part {{/isFile}}{{/isFormParam}}
|
||||
@@ -0,0 +1 @@
|
||||
{{#isHeaderParam}}@Header("{{baseName}}") {{paramName}}: {{{dataType}}}{{/isHeaderParam}}
|
||||
@@ -0,0 +1,43 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
import okhttp3.OkHttpClient
|
||||
import retrofit2.Retrofit
|
||||
import retrofit2.converter.scalars.ScalarsConverterFactory
|
||||
{{#gson}}
|
||||
import retrofit2.converter.gson.GsonConverterFactory
|
||||
{{/gson}}
|
||||
{{#moshi}}
|
||||
import retrofit2.converter.moshi.MoshiConverterFactory
|
||||
{{/moshi}}
|
||||
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class ApiClient(
|
||||
private var baseUrl: String = "{{{basePath}}}",
|
||||
private var okHttpClient: OkHttpClient
|
||||
) {
|
||||
init {
|
||||
normalizeBaseUrl()
|
||||
}
|
||||
|
||||
val retrofitBuilder: Retrofit.Builder by lazy {
|
||||
|
||||
Retrofit.Builder()
|
||||
.baseUrl(baseUrl)
|
||||
.addConverterFactory(ScalarsConverterFactory.create())
|
||||
{{#gson}}
|
||||
.addConverterFactory(GsonConverterFactory.create(Serializer.gson))
|
||||
{{/gson}}
|
||||
{{#moshi}}
|
||||
.addConverterFactory(MoshiConverterFactory.create(Serializer.moshi))
|
||||
{{/moshi}}
|
||||
}
|
||||
|
||||
fun <S> createService(serviceClass: Class<S>): S {
|
||||
return retrofitBuilder.client(okHttpClient).build().create(serviceClass)
|
||||
}
|
||||
|
||||
private fun normalizeBaseUrl() {
|
||||
if (!baseUrl.endsWith("/")) {
|
||||
baseUrl += "/"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.FromJson
|
||||
import com.squareup.moshi.ToJson
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
import com.google.gson.TypeAdapter
|
||||
import com.google.gson.stream.JsonReader
|
||||
import com.google.gson.stream.JsonWriter
|
||||
import com.google.gson.stream.JsonToken.NULL
|
||||
import java.io.IOException
|
||||
{{/gson}}
|
||||
|
||||
{{#moshi}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class ByteArrayAdapter {
|
||||
@ToJson
|
||||
fun toJson(data: ByteArray): String = String(data)
|
||||
|
||||
@FromJson
|
||||
fun fromJson(data: String): ByteArray = data.toByteArray()
|
||||
}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class ByteArrayAdapter : TypeAdapter<ByteArray>() {
|
||||
@Throws(IOException::class)
|
||||
override fun write(out: JsonWriter?, value: ByteArray?) {
|
||||
if (value == null) {
|
||||
out?.nullValue()
|
||||
} else {
|
||||
out?.value(String(value))
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun read(out: JsonReader?): ByteArray? {
|
||||
out ?: return null
|
||||
|
||||
when (out.peek()) {
|
||||
NULL -> {
|
||||
out.nextNull()
|
||||
return null
|
||||
}
|
||||
else -> {
|
||||
return out.nextString().toByteArray()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/gson}}
|
||||
@@ -0,0 +1,56 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
class CollectionFormats {
|
||||
|
||||
open class CSVParams {
|
||||
|
||||
var params: List<String>
|
||||
|
||||
constructor(params: List<String>) {
|
||||
this.params = params
|
||||
}
|
||||
|
||||
constructor(vararg params: String) {
|
||||
this.params = listOf(*params)
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return params.joinToString(",")
|
||||
}
|
||||
}
|
||||
|
||||
open class SSVParams : CSVParams {
|
||||
|
||||
constructor(params: List<String>) : super(params)
|
||||
|
||||
constructor(vararg params: String) : super(*params)
|
||||
|
||||
override fun toString(): String {
|
||||
return params.joinToString(" ")
|
||||
}
|
||||
}
|
||||
|
||||
class TSVParams : CSVParams {
|
||||
|
||||
constructor(params: List<String>) : super(params)
|
||||
|
||||
constructor(vararg params: String) : super(*params)
|
||||
|
||||
override fun toString(): String {
|
||||
return params.joinToString("\t")
|
||||
}
|
||||
}
|
||||
|
||||
class PIPESParams : CSVParams {
|
||||
|
||||
constructor(params: List<String>) : super(params)
|
||||
|
||||
constructor(vararg params: String) : super(*params)
|
||||
|
||||
override fun toString(): String {
|
||||
return params.joinToString("|")
|
||||
}
|
||||
}
|
||||
|
||||
class SPACEParams : SSVParams()
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
import com.google.gson.TypeAdapter
|
||||
import com.google.gson.stream.JsonReader
|
||||
import com.google.gson.stream.JsonWriter
|
||||
import com.google.gson.stream.JsonToken.NULL
|
||||
import java.io.IOException
|
||||
import java.text.DateFormat
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class DateAdapter(val formatter: DateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.getDefault())) : TypeAdapter<Date>() {
|
||||
@Throws(IOException::class)
|
||||
override fun write(out: JsonWriter?, value: Date?) {
|
||||
if (value == null) {
|
||||
out?.nullValue()
|
||||
} else {
|
||||
out?.value(formatter.format(value))
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun read(out: JsonReader?): Date? {
|
||||
out ?: return null
|
||||
|
||||
when (out.peek()) {
|
||||
NULL -> {
|
||||
out.nextNull()
|
||||
return null
|
||||
}
|
||||
else -> {
|
||||
return formatter.parse(out.nextString())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.FromJson
|
||||
import com.squareup.moshi.ToJson
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
import com.google.gson.TypeAdapter
|
||||
import com.google.gson.stream.JsonReader
|
||||
import com.google.gson.stream.JsonWriter
|
||||
import com.google.gson.stream.JsonToken.NULL
|
||||
import java.io.IOException
|
||||
{{/gson}}
|
||||
{{^threetenbp}}
|
||||
import java.time.LocalDate
|
||||
import java.time.format.DateTimeFormatter
|
||||
{{/threetenbp}}
|
||||
{{#threetenbp}}
|
||||
import org.threeten.bp.LocalDate
|
||||
import org.threeten.bp.format.DateTimeFormatter
|
||||
{{/threetenbp}}
|
||||
|
||||
{{#moshi}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class LocalDateAdapter {
|
||||
@ToJson
|
||||
fun toJson(value: LocalDate): String {
|
||||
return DateTimeFormatter.ISO_LOCAL_DATE.format(value)
|
||||
}
|
||||
|
||||
@FromJson
|
||||
fun fromJson(value: String): LocalDate {
|
||||
return LocalDate.parse(value, DateTimeFormatter.ISO_LOCAL_DATE)
|
||||
}
|
||||
|
||||
}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class LocalDateAdapter(private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE) : TypeAdapter<LocalDate>() {
|
||||
@Throws(IOException::class)
|
||||
override fun write(out: JsonWriter?, value: LocalDate?) {
|
||||
if (value == null) {
|
||||
out?.nullValue()
|
||||
} else {
|
||||
out?.value(formatter.format(value))
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun read(out: JsonReader?): LocalDate? {
|
||||
out ?: return null
|
||||
|
||||
when (out.peek()) {
|
||||
NULL -> {
|
||||
out.nextNull()
|
||||
return null
|
||||
}
|
||||
else -> {
|
||||
return LocalDate.parse(out.nextString(), formatter)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/gson}}
|
||||
@@ -0,0 +1,63 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.FromJson
|
||||
import com.squareup.moshi.ToJson
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
import com.google.gson.TypeAdapter
|
||||
import com.google.gson.stream.JsonReader
|
||||
import com.google.gson.stream.JsonWriter
|
||||
import com.google.gson.stream.JsonToken.NULL
|
||||
import java.io.IOException
|
||||
{{/gson}}
|
||||
{{^threetenbp}}
|
||||
import java.time.LocalDateTime
|
||||
import java.time.format.DateTimeFormatter
|
||||
{{/threetenbp}}
|
||||
{{#threetenbp}}
|
||||
import org.threeten.bp.LocalDateTime
|
||||
import org.threeten.bp.format.DateTimeFormatter
|
||||
{{/threetenbp}}
|
||||
|
||||
{{#moshi}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class LocalDateTimeAdapter {
|
||||
@ToJson
|
||||
fun toJson(value: LocalDateTime): String {
|
||||
return DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(value)
|
||||
}
|
||||
|
||||
@FromJson
|
||||
fun fromJson(value: String): LocalDateTime {
|
||||
return LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||
}
|
||||
|
||||
}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class LocalDateTimeAdapter(private val formatter: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME) : TypeAdapter<LocalDateTime>() {
|
||||
@Throws(IOException::class)
|
||||
override fun write(out: JsonWriter?, value: LocalDateTime?) {
|
||||
if (value == null) {
|
||||
out?.nullValue()
|
||||
} else {
|
||||
out?.value(formatter.format(value))
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun read(out: JsonReader?): LocalDateTime? {
|
||||
out ?: return null
|
||||
|
||||
when (out.peek()) {
|
||||
NULL -> {
|
||||
out.nextNull()
|
||||
return null
|
||||
}
|
||||
else -> {
|
||||
return LocalDateTime.parse(out.nextString(), formatter)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/gson}}
|
||||
@@ -0,0 +1,45 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.Moshi
|
||||
import com.squareup.moshi.adapters.Rfc3339DateJsonAdapter
|
||||
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.GsonBuilder
|
||||
{{^threetenbp}}
|
||||
import java.time.LocalDate
|
||||
import java.time.LocalDateTime
|
||||
{{/threetenbp}}
|
||||
{{#threetenbp}}
|
||||
import org.threeten.bp.LocalDate
|
||||
import org.threeten.bp.LocalDateTime
|
||||
{{/threetenbp}}
|
||||
import java.util.UUID
|
||||
{{/gson}}
|
||||
import java.util.Date
|
||||
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}object Serializer {
|
||||
{{#moshi}}
|
||||
@JvmStatic
|
||||
val moshi: Moshi = Moshi.Builder()
|
||||
.add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
|
||||
.add(LocalDateTimeAdapter())
|
||||
.add(LocalDateAdapter())
|
||||
.add(UUIDAdapter())
|
||||
.add(ByteArrayAdapter())
|
||||
.add(KotlinJsonAdapterFactory())
|
||||
.build()
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
@JvmStatic
|
||||
val gson: Gson = GsonBuilder()
|
||||
.registerTypeAdapter(Date::class.java, DateAdapter())
|
||||
.registerTypeAdapter(LocalDateTime::class.java, LocalDateTimeAdapter())
|
||||
.registerTypeAdapter(LocalDate::class.java, LocalDateAdapter())
|
||||
.registerTypeAdapter(UUID::class.java, UUIDAdapter())
|
||||
.registerTypeAdapter(ByteArray::class.java, ByteArrayAdapter())
|
||||
.create()
|
||||
{{/gson}}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package {{packageName}}.infrastructure
|
||||
|
||||
{{#moshi}}
|
||||
import com.squareup.moshi.FromJson
|
||||
import com.squareup.moshi.ToJson
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
import com.google.gson.TypeAdapter
|
||||
import com.google.gson.stream.JsonReader
|
||||
import com.google.gson.stream.JsonWriter
|
||||
import com.google.gson.stream.JsonToken.NULL
|
||||
import java.io.IOException
|
||||
{{/gson}}
|
||||
import java.util.UUID
|
||||
|
||||
{{#moshi}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class UUIDAdapter {
|
||||
@ToJson
|
||||
fun toJson(uuid: UUID) = uuid.toString()
|
||||
|
||||
@FromJson
|
||||
fun fromJson(s: String) = UUID.fromString(s)
|
||||
}
|
||||
{{/moshi}}
|
||||
{{#gson}}
|
||||
{{#nonPublicApi}}internal {{/nonPublicApi}}class UUIDAdapter : TypeAdapter<UUID>() {
|
||||
@Throws(IOException::class)
|
||||
override fun write(out: JsonWriter?, value: UUID?) {
|
||||
if (value == null) {
|
||||
out?.nullValue()
|
||||
} else {
|
||||
out?.value(value.toString())
|
||||
}
|
||||
}
|
||||
|
||||
@Throws(IOException::class)
|
||||
override fun read(out: JsonReader?): UUID? {
|
||||
out ?: return null
|
||||
|
||||
when (out.peek()) {
|
||||
NULL -> {
|
||||
out.nextNull()
|
||||
return null
|
||||
}
|
||||
else -> {
|
||||
return UUID.fromString(out.nextString())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
{{/gson}}
|
||||
@@ -0,0 +1 @@
|
||||
{{#isPathParam}}@Path("{{baseName}}") {{paramName}}: {{{dataType}}}{{/isPathParam}}
|
||||
@@ -0,0 +1 @@
|
||||
{{#isQueryParam}}@Query("{{baseName}}") {{paramName}}: {{#collectionFormat}}{{#isCollectionFormatMulti}}{{{dataType}}}{{/isCollectionFormatMulti}}{{^isCollectionFormatMulti}}{{{collectionFormat.toUpperCase}}}Params{{/isCollectionFormatMulti}}{{/collectionFormat}}{{^collectionFormat}}{{{dataType}}}{{/collectionFormat}}{{/isQueryParam}}
|
||||
Reference in New Issue
Block a user