diesieben07
04/06/2021, 3:01 PMJoost Klitsie
04/06/2021, 3:24 PMdiesieben07
04/06/2021, 3:25 PMJoost Klitsie
04/06/2021, 3:28 PMdiesieben07
04/06/2021, 3:29 PMJsonContentPolymorphicSerializer
lets me do. But OpenAPI Schema can come as JSON or YAMLJoost Klitsie
04/06/2021, 3:29 PMJoost Klitsie
04/06/2021, 3:30 PMdiesieben07
04/06/2021, 3:30 PMdiesieben07
04/06/2021, 3:30 PMchristophsturm
04/06/2021, 4:02 PMchristophsturm
04/06/2021, 4:04 PMdiesieben07
04/06/2021, 6:04 PMadditionalProperties
christophsturm
04/06/2021, 6:35 PMdiesieben07
04/06/2021, 6:36 PMchristophsturm
04/06/2021, 7:28 PMdiesieben07
04/06/2021, 7:30 PMchristophsturm
04/06/2021, 8:38 PMdiesieben07
04/06/2021, 8:47 PMdiesieben07
04/06/2021, 8:47 PMchristophsturm
04/06/2021, 8:49 PMdiesieben07
04/06/2021, 8:50 PMchristophsturm
04/06/2021, 8:51 PMchristophsturm
04/06/2021, 8:54 PMdiesieben07
04/06/2021, 8:56 PMchristophsturm
04/06/2021, 9:10 PMdiesieben07
04/06/2021, 9:34 PMadk
04/10/2021, 1:43 PM@Serializable(with=MyCustomSerializer::class)
should let you do the necessary handling.adk
04/10/2021, 1:43 PMEither<Boolean, MyNestedType>
might be a workable approach. (Arrow has an implementation of Either, but that might be a bit heavyweight for just that one type. Not hard to write your own.)diesieben07
04/11/2021, 11:33 AMdiesieben07
04/11/2021, 11:33 AMadk
04/11/2021, 4:19 PM@Test
fun `union type serialization test`() {
val json = Json { }
expectThat(json.decodeFromString<Complicated>("""{ "union": true }"""))
.get { union }
.isA<Either.Left<Boolean>>()
.get { left }.isEqualTo(true)
expectThat(json.decodeFromString<Complicated>("""{ "union": "bob" }"""))
.get { union }
.isA<Either.Right<String>>()
.get { right }.isEqualTo("bob")
}
This test passes with this code:
@Serializable
data class Complicated(@Serializable(with = UnionSerializer::class) val union: Either<Boolean, String>)
class UnionSerializer(val leftSerializer: KSerializer<Boolean> = serializer(), val rightSerializer: KSerializer<String> = serializer()) : KSerializer<Either<Boolean, String>> {
override fun deserialize(decoder: Decoder): Either<Boolean, String> {
return either { decoder.decodeSerializableValue(rightSerializer) }.or { decoder.decodeSerializableValue(leftSerializer) }
}
override val descriptor: SerialDescriptor
get() = TODO("Not yet implemented")
override fun serialize(encoder: Encoder, value: Either<Boolean, String>) {
TODO("Not yet implemented")
}
}
fun <R> either(block: () -> R): Either<Exception, R> {
return try {
Either.Right(block())
} catch (x: Exception) {
Either.Left(x)
}
}
fun <L, R> Either<Exception, R>.or(block: () -> L) : Either<L, R> {
return mapLeft { block() }
}
adk
04/11/2021, 4:23 PMadk
04/11/2021, 4:25 PMadk
04/11/2021, 4:28 PMdiesieben07
04/11/2021, 7:33 PMadk
04/11/2021, 9:30 PMdiesieben07
04/11/2021, 9:43 PMchristophsturm
04/12/2021, 8:21 AMdiesieben07
04/12/2021, 8:47 AMchristophsturm
04/12/2021, 8:53 AM