2.18 serialization issues fix. Fixes #61.

This commit is contained in:
aminecmi 2022-09-24 21:54:50 +02:00
parent da71de6806
commit bd96c67788

View File

@ -2,7 +2,14 @@ package bou.amine.apps.readerforselfossv2.model
import bou.amine.apps.readerforselfossv2.utils.DateUtils import bou.amine.apps.readerforselfossv2.utils.DateUtils
import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded import bou.amine.apps.readerforselfossv2.utils.getHtmlDecoded
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.*
class SelfossModel { class SelfossModel {
@ -50,6 +57,7 @@ class SelfossModel {
data class Source( data class Source(
val id: Int, val id: Int,
val title: String, val title: String,
@Serializable(with = TagsListSerializer::class)
val tags: List<String>, val tags: List<String>,
val spout: String, val spout: String,
val error: String, val error: String,
@ -62,12 +70,15 @@ class SelfossModel {
val datetime: String, val datetime: String,
val title: String, val title: String,
val content: String, val content: String,
@Serializable(with = BooleanSerializer::class)
var unread: Boolean, var unread: Boolean,
@Serializable(with = BooleanSerializer::class)
var starred: Boolean, var starred: Boolean,
val thumbnail: String?, val thumbnail: String?,
val icon: String?, val icon: String?,
val link: String, val link: String,
val sourcetitle: String, val sourcetitle: String,
@Serializable(with = TagsListSerializer::class)
val tags: List<String> val tags: List<String>
) { ) {
// TODO: maybe find a better way to handle these kind of urls // TODO: maybe find a better way to handle these kind of urls
@ -106,6 +117,38 @@ class SelfossModel {
} }
} }
// TODO: this seems to be super slow.
object TagsListSerializer : KSerializer<List<String>> {
override fun deserialize(decoder: Decoder): List<String> {
return when(val json = ((decoder as JsonDecoder).decodeJsonElement())) {
is JsonArray -> json.toList().map { it.toString() }
else -> json.toString().split(",")
}
}
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("tags", PrimitiveKind.STRING)
override fun serialize(encoder: Encoder, value: List<String>) {
TODO("Not yet implemented")
}
}
object BooleanSerializer : KSerializer<Boolean> {
override fun deserialize(decoder: Decoder): Boolean {
val json = ((decoder as JsonDecoder).decodeJsonElement()).jsonPrimitive
return json.booleanOrNull ?: json.int == 1
}
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("b", PrimitiveKind.BOOLEAN)
override fun serialize(encoder: Encoder, value: Boolean) {
TODO("Not yet implemented")
}
}
class StatusAndData<T>(val success: Boolean, val data: T? = null) { class StatusAndData<T>(val success: Boolean, val data: T? = null) {
companion object { companion object {
fun <T> succes(d: T): StatusAndData<T> { fun <T> succes(d: T): StatusAndData<T> {
@ -117,4 +160,4 @@ class SelfossModel {
} }
} }
} }
} }