Skip to content

Instantly share code, notes, and snippets.

@Y2Kot
Created May 15, 2020 19:04
Show Gist options
  • Save Y2Kot/d04e7741dda120515785fbb0d9c686d1 to your computer and use it in GitHub Desktop.
Save Y2Kot/d04e7741dda120515785fbb0d9c686d1 to your computer and use it in GitHub Desktop.
@Serializer(forClass = BaseResponse::class)
class BaseResponseSerializer<T : Any>(private val dataSerializer: KSerializer<T>): KSerializer<BaseResponse<T>> {
override val descriptor: SerialDescriptor
get() = SerialDescriptor("BaseResponseSerializer") {
val dataDescriptor = dataSerializer.descriptor
element("resultCode", String.serializer().descriptor)
element("payload", dataDescriptor)
element("trackingId", String.serializer().descriptor)
element("details", Details.serializer().descriptor)
}
override fun deserialize(decoder: Decoder): BaseResponse<T> {
val inp = decoder.beginStructure(descriptor)
lateinit var resultCode: String
lateinit var payload: T
lateinit var trackingId: String
lateinit var details: Details
loop@while(true) {
when (val i = inp.decodeElementIndex(descriptor)) {
CompositeDecoder.READ_DONE -> break@loop
0 -> resultCode = inp.decodeStringElement(descriptor, i)
1 -> payload = inp.decodeSerializableElement(descriptor, i, dataSerializer)
2 -> trackingId = inp.decodeStringElement(descriptor, i)
3 -> details = inp.decodeSerializableElement(descriptor, i, Details.serializer())
else -> throw SerializationException("Unknown index $i")
}
}
inp.endStructure(descriptor)
return BaseResponse(resultCode, payload, trackingId, details)
}
override fun serialize(encoder: Encoder, value: BaseResponse<T>) {
TODO("Not yet implemented")
/*val out = encoder.beginStructure(descriptor)
out.encodeStringElement(descriptor, 0, value.resultCode)
out.encodeSerializableElement(descriptor, 1, dataSerializer, value.payload)*/
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment