From 8945f9e33f78b6d1ad8b0a9485ac583af62fd92e Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Sun, 4 Jun 2023 18:23:05 +0530 Subject: [PATCH] feat(database): build a custom serializer for `SavedPost` --- database/build.gradle.kts | 2 + .../claw/database/SavedPostSerializer.kt | 99 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 database/src/main/kotlin/dev/msfjarvis/claw/database/SavedPostSerializer.kt diff --git a/database/build.gradle.kts b/database/build.gradle.kts index 6994c6ab..e99d1f91 100644 --- a/database/build.gradle.kts +++ b/database/build.gradle.kts @@ -9,6 +9,7 @@ import dev.msfjarvis.claw.gradle.addTestDependencies plugins { id("dev.msfjarvis.claw.android-library") id("dev.msfjarvis.claw.kotlin-android") + alias(libs.plugins.kotlin.serialization) alias(libs.plugins.anvil) alias(libs.plugins.sqldelight) alias(libs.plugins.whetstone) @@ -33,6 +34,7 @@ dependencies { implementation(libs.sqldelight.androidDriver) implementation(libs.sqldelight.primitiveAdapters) implementation(libs.sqlite.android) + implementation(libs.kotlinx.serialization.core) testImplementation(libs.sqldelight.jvmDriver) addTestDependencies(project) diff --git a/database/src/main/kotlin/dev/msfjarvis/claw/database/SavedPostSerializer.kt b/database/src/main/kotlin/dev/msfjarvis/claw/database/SavedPostSerializer.kt new file mode 100644 index 00000000..3e68840a --- /dev/null +++ b/database/src/main/kotlin/dev/msfjarvis/claw/database/SavedPostSerializer.kt @@ -0,0 +1,99 @@ +/* + * Copyright © 2023 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.database + +import dev.msfjarvis.claw.database.local.SavedPost +import kotlinx.serialization.ExperimentalSerializationApi +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Serializer +import kotlinx.serialization.builtins.ListSerializer +import kotlinx.serialization.builtins.serializer +import kotlinx.serialization.descriptors.SerialDescriptor +import kotlinx.serialization.descriptors.buildClassSerialDescriptor +import kotlinx.serialization.descriptors.element +import kotlinx.serialization.encoding.CompositeDecoder +import kotlinx.serialization.encoding.Decoder +import kotlinx.serialization.encoding.Encoder +import kotlinx.serialization.encoding.decodeStructure +import kotlinx.serialization.encoding.encodeStructure + +@OptIn(ExperimentalSerializationApi::class) +@Serializer(forClass = SavedPost::class) +class SavedPostSerializer : KSerializer { + private val delegateSerializer = ListSerializer(String.serializer()) + override val descriptor: SerialDescriptor = + buildClassSerialDescriptor("SavedPost") { + element("shortId") + element("title") + element("url") + element("createdAt") + element("commentCount", isOptional = true) + element("commentsUrl") + element("submitterName") + element("submitterAvatarUrl") + element>("tags") + element("description") + } + + override fun deserialize(decoder: Decoder): SavedPost { + return decoder.decodeStructure(descriptor) { + var shortId = "" + var title = "" + var url = "" + var createdAt = "" + var commentCount: Int? = null + var commentsUrl = "" + var submitterName = "" + var submitterAvatarUrl = "" + var tags = emptyList() + var description = "" + while (true) { + when (val index = decodeElementIndex(descriptor)) { + 0 -> shortId = decodeStringElement(descriptor, 0) + 1 -> title = decodeStringElement(descriptor, 1) + 2 -> url = decodeStringElement(descriptor, 2) + 3 -> createdAt = decodeStringElement(descriptor, 3) + 4 -> commentCount = decodeNullableSerializableElement(descriptor, 4, Int.serializer()) + 5 -> commentsUrl = decodeStringElement(descriptor, 5) + 6 -> submitterName = decodeStringElement(descriptor, 6) + 7 -> submitterAvatarUrl = decodeStringElement(descriptor, 7) + 8 -> tags = decodeSerializableElement(descriptor, 8, delegateSerializer) + 9 -> description = decodeStringElement(descriptor, 9) + CompositeDecoder.DECODE_DONE -> break + else -> error("Unexpected index: $index") + } + } + SavedPost( + shortId = shortId, + title = title, + url = url, + createdAt = createdAt, + commentCount = commentCount, + commentsUrl = commentsUrl, + submitterName = submitterName, + submitterAvatarUrl = submitterAvatarUrl, + tags = tags, + description = description, + ) + } + } + + override fun serialize(encoder: Encoder, value: SavedPost) { + encoder.encodeStructure(descriptor) { + encodeStringElement(descriptor, 0, value.shortId) + encodeStringElement(descriptor, 1, value.title) + encodeStringElement(descriptor, 2, value.url) + encodeStringElement(descriptor, 3, value.createdAt) + encodeNullableSerializableElement(descriptor, 4, Int.serializer(), value.commentCount) + encodeStringElement(descriptor, 5, value.commentsUrl) + encodeStringElement(descriptor, 6, value.submitterName) + encodeStringElement(descriptor, 7, value.submitterAvatarUrl) + encodeSerializableElement(descriptor, 8, delegateSerializer, value.tags) + encodeStringElement(descriptor, 9, value.description) + } + } +}