Skip to content

Commit 4c6357d

Browse files
committed
[kotlin][client] make kotlinx serialization configurable from outside
1 parent cd2fbd6 commit 4c6357d

File tree

4 files changed

+174
-62
lines changed
  • modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure
  • samples/client/petstore
    • kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure
    • kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure
    • kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure

4 files changed

+174
-62
lines changed

modules/openapi-generator/src/main/resources/kotlin-client/jvm-common/infrastructure/Serializer.kt.mustache

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -126,42 +126,70 @@ import java.util.concurrent.atomic.AtomicLong
126126
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, {{failOnUnknownProperties}})
127127
{{/jackson}}
128128
{{#kotlinx_serialization}}
129-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
129+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
130130
@JvmStatic
131131
val kotlinSerializationAdapters: SerializersModule
132132
get() { return kotlinxSerializationAdapters }
133133

134+
private var isAdaptersInitialized = false
135+
134136
@JvmStatic
135-
val kotlinxSerializationAdapters = SerializersModule {
136-
contextual(BigDecimal::class, BigDecimalAdapter)
137-
contextual(BigInteger::class, BigIntegerAdapter)
138-
{{^kotlinx-datetime}}
139-
contextual(LocalDate::class, LocalDateAdapter)
140-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
141-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
142-
{{/kotlinx-datetime}}
143-
contextual(UUID::class, UUIDAdapter)
144-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
145-
contextual(AtomicLong::class, AtomicLongAdapter)
146-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
147-
contextual(URI::class, URIAdapter)
148-
contextual(URL::class, URLAdapter)
149-
contextual(StringBuilder::class, StringBuilderAdapter)
137+
val kotlinxSerializationAdapters: SerializersModule by lazy {
138+
isAdaptersInitialized = true
139+
SerializersModule {
140+
contextual(BigDecimal::class, BigDecimalAdapter)
141+
contextual(BigInteger::class, BigIntegerAdapter)
142+
{{^kotlinx-datetime}}
143+
contextual(LocalDate::class, LocalDateAdapter)
144+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
145+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
146+
{{/kotlinx-datetime}}
147+
contextual(UUID::class, UUIDAdapter)
148+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
149+
contextual(AtomicLong::class, AtomicLongAdapter)
150+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
151+
contextual(URI::class, URIAdapter)
152+
contextual(URL::class, URLAdapter)
153+
contextual(StringBuilder::class, StringBuilderAdapter)
154+
155+
apply(kotlinxSerializationAdaptersConfiguration)
156+
}
150157
}
151158

152-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
159+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
160+
set(value) {
161+
check(!isAdaptersInitialized) {
162+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
163+
}
164+
field = value
165+
}
166+
167+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
153168
@JvmStatic
154169
val jvmJson: Json
155170
get() { return kotlinxSerializationJson }
156171

172+
private var isJsonInitialized = false
173+
157174
@JvmStatic
158175
val kotlinxSerializationJson: Json by lazy {
176+
isJsonInitialized = true
159177
Json {
160178
serializersModule = kotlinxSerializationAdapters
161179
encodeDefaults = true
162180
ignoreUnknownKeys = true
163181
isLenient = true
182+
183+
apply(kotlinxSerializationJsonConfiguration)
164184
}
165185
}
186+
187+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
188+
set(value) {
189+
check(!isJsonInitialized) {
190+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
191+
}
192+
field = value
193+
}
166194
{{/kotlinx_serialization}}
167195
}

samples/client/petstore/kotlin-json-request-string/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,67 @@ import java.util.concurrent.atomic.AtomicInteger
1515
import java.util.concurrent.atomic.AtomicLong
1616

1717
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
18+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1919
@JvmStatic
2020
val kotlinSerializationAdapters: SerializersModule
2121
get() { return kotlinxSerializationAdapters }
2222

23+
private var isAdaptersInitialized = false
24+
2325
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
26+
val kotlinxSerializationAdapters: SerializersModule by lazy {
27+
isAdaptersInitialized = true
28+
SerializersModule {
29+
contextual(BigDecimal::class, BigDecimalAdapter)
30+
contextual(BigInteger::class, BigIntegerAdapter)
31+
contextual(LocalDate::class, LocalDateAdapter)
32+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
33+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
34+
contextual(UUID::class, UUIDAdapter)
35+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
36+
contextual(AtomicLong::class, AtomicLongAdapter)
37+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
38+
contextual(URI::class, URIAdapter)
39+
contextual(URL::class, URLAdapter)
40+
contextual(StringBuilder::class, StringBuilderAdapter)
41+
42+
apply(kotlinxSerializationAdaptersConfiguration)
43+
}
3744
}
3845

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
46+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
47+
set(value) {
48+
check(!isAdaptersInitialized) {
49+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
50+
}
51+
field = value
52+
}
53+
54+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4055
@JvmStatic
4156
val jvmJson: Json
4257
get() { return kotlinxSerializationJson }
4358

59+
private var isJsonInitialized = false
60+
4461
@JvmStatic
4562
val kotlinxSerializationJson: Json by lazy {
63+
isJsonInitialized = true
4664
Json {
4765
serializersModule = kotlinxSerializationAdapters
4866
encodeDefaults = true
4967
ignoreUnknownKeys = true
5068
isLenient = true
69+
70+
apply(kotlinxSerializationJsonConfiguration)
5171
}
5272
}
73+
74+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
75+
set(value) {
76+
check(!isJsonInitialized) {
77+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
78+
}
79+
field = value
80+
}
5381
}

samples/client/petstore/kotlin-retrofit2-kotlinx_serialization/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,67 @@ import java.util.concurrent.atomic.AtomicInteger
1515
import java.util.concurrent.atomic.AtomicLong
1616

1717
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
18+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1919
@JvmStatic
2020
val kotlinSerializationAdapters: SerializersModule
2121
get() { return kotlinxSerializationAdapters }
2222

23+
private var isAdaptersInitialized = false
24+
2325
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
26+
val kotlinxSerializationAdapters: SerializersModule by lazy {
27+
isAdaptersInitialized = true
28+
SerializersModule {
29+
contextual(BigDecimal::class, BigDecimalAdapter)
30+
contextual(BigInteger::class, BigIntegerAdapter)
31+
contextual(LocalDate::class, LocalDateAdapter)
32+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
33+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
34+
contextual(UUID::class, UUIDAdapter)
35+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
36+
contextual(AtomicLong::class, AtomicLongAdapter)
37+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
38+
contextual(URI::class, URIAdapter)
39+
contextual(URL::class, URLAdapter)
40+
contextual(StringBuilder::class, StringBuilderAdapter)
41+
42+
apply(kotlinxSerializationAdaptersConfiguration)
43+
}
3744
}
3845

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
46+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
47+
set(value) {
48+
check(!isAdaptersInitialized) {
49+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
50+
}
51+
field = value
52+
}
53+
54+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4055
@JvmStatic
4156
val jvmJson: Json
4257
get() { return kotlinxSerializationJson }
4358

59+
private var isJsonInitialized = false
60+
4461
@JvmStatic
4562
val kotlinxSerializationJson: Json by lazy {
63+
isJsonInitialized = true
4664
Json {
4765
serializersModule = kotlinxSerializationAdapters
4866
encodeDefaults = true
4967
ignoreUnknownKeys = true
5068
isLenient = true
69+
70+
apply(kotlinxSerializationJsonConfiguration)
5171
}
5272
}
73+
74+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
75+
set(value) {
76+
check(!isJsonInitialized) {
77+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
78+
}
79+
field = value
80+
}
5381
}

samples/client/petstore/kotlin-uppercase-enum/src/main/kotlin/org/openapitools/client/infrastructure/Serializer.kt

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,67 @@ import java.util.concurrent.atomic.AtomicInteger
1515
import java.util.concurrent.atomic.AtomicLong
1616

1717
object Serializer {
18-
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"))
18+
@Deprecated("Use Serializer.kotlinxSerializationAdapters instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationAdapters"), level = DeprecationLevel.ERROR)
1919
@JvmStatic
2020
val kotlinSerializationAdapters: SerializersModule
2121
get() { return kotlinxSerializationAdapters }
2222

23+
private var isAdaptersInitialized = false
24+
2325
@JvmStatic
24-
val kotlinxSerializationAdapters = SerializersModule {
25-
contextual(BigDecimal::class, BigDecimalAdapter)
26-
contextual(BigInteger::class, BigIntegerAdapter)
27-
contextual(LocalDate::class, LocalDateAdapter)
28-
contextual(LocalDateTime::class, LocalDateTimeAdapter)
29-
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
30-
contextual(UUID::class, UUIDAdapter)
31-
contextual(AtomicInteger::class, AtomicIntegerAdapter)
32-
contextual(AtomicLong::class, AtomicLongAdapter)
33-
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
34-
contextual(URI::class, URIAdapter)
35-
contextual(URL::class, URLAdapter)
36-
contextual(StringBuilder::class, StringBuilderAdapter)
26+
val kotlinxSerializationAdapters: SerializersModule by lazy {
27+
isAdaptersInitialized = true
28+
SerializersModule {
29+
contextual(BigDecimal::class, BigDecimalAdapter)
30+
contextual(BigInteger::class, BigIntegerAdapter)
31+
contextual(LocalDate::class, LocalDateAdapter)
32+
contextual(LocalDateTime::class, LocalDateTimeAdapter)
33+
contextual(OffsetDateTime::class, OffsetDateTimeAdapter)
34+
contextual(UUID::class, UUIDAdapter)
35+
contextual(AtomicInteger::class, AtomicIntegerAdapter)
36+
contextual(AtomicLong::class, AtomicLongAdapter)
37+
contextual(AtomicBoolean::class, AtomicBooleanAdapter)
38+
contextual(URI::class, URIAdapter)
39+
contextual(URL::class, URLAdapter)
40+
contextual(StringBuilder::class, StringBuilderAdapter)
41+
42+
apply(kotlinxSerializationAdaptersConfiguration)
43+
}
3744
}
3845

39-
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"))
46+
var kotlinxSerializationAdaptersConfiguration: SerializersModuleBuilder.() -> Unit = {}
47+
set(value) {
48+
check(!isAdaptersInitialized) {
49+
"Cannot configure kotlinxSerializationAdaptersConfiguration after kotlinxSerializationAdapters has been initialized."
50+
}
51+
field = value
52+
}
53+
54+
@Deprecated("Use Serializer.kotlinxSerializationJson instead", replaceWith = ReplaceWith("Serializer.kotlinxSerializationJson"), level = DeprecationLevel.ERROR)
4055
@JvmStatic
4156
val jvmJson: Json
4257
get() { return kotlinxSerializationJson }
4358

59+
private var isJsonInitialized = false
60+
4461
@JvmStatic
4562
val kotlinxSerializationJson: Json by lazy {
63+
isJsonInitialized = true
4664
Json {
4765
serializersModule = kotlinxSerializationAdapters
4866
encodeDefaults = true
4967
ignoreUnknownKeys = true
5068
isLenient = true
69+
70+
apply(kotlinxSerializationJsonConfiguration)
5171
}
5272
}
73+
74+
var kotlinxSerializationJsonConfiguration: JsonBuilder.() -> Unit = {}
75+
set(value) {
76+
check(!isJsonInitialized) {
77+
"Cannot configure kotlinxSerializationJsonConfiguration after kotlinxSerializationJson has been initialized."
78+
}
79+
field = value
80+
}
5381
}

0 commit comments

Comments
 (0)