mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 22:17:03 +05:30
feat(database): build a custom serializer for SavedPost
This commit is contained in:
parent
2895e7ffe7
commit
8945f9e33f
2 changed files with 101 additions and 0 deletions
|
@ -9,6 +9,7 @@ import dev.msfjarvis.claw.gradle.addTestDependencies
|
||||||
plugins {
|
plugins {
|
||||||
id("dev.msfjarvis.claw.android-library")
|
id("dev.msfjarvis.claw.android-library")
|
||||||
id("dev.msfjarvis.claw.kotlin-android")
|
id("dev.msfjarvis.claw.kotlin-android")
|
||||||
|
alias(libs.plugins.kotlin.serialization)
|
||||||
alias(libs.plugins.anvil)
|
alias(libs.plugins.anvil)
|
||||||
alias(libs.plugins.sqldelight)
|
alias(libs.plugins.sqldelight)
|
||||||
alias(libs.plugins.whetstone)
|
alias(libs.plugins.whetstone)
|
||||||
|
@ -33,6 +34,7 @@ dependencies {
|
||||||
implementation(libs.sqldelight.androidDriver)
|
implementation(libs.sqldelight.androidDriver)
|
||||||
implementation(libs.sqldelight.primitiveAdapters)
|
implementation(libs.sqldelight.primitiveAdapters)
|
||||||
implementation(libs.sqlite.android)
|
implementation(libs.sqlite.android)
|
||||||
|
implementation(libs.kotlinx.serialization.core)
|
||||||
|
|
||||||
testImplementation(libs.sqldelight.jvmDriver)
|
testImplementation(libs.sqldelight.jvmDriver)
|
||||||
addTestDependencies(project)
|
addTestDependencies(project)
|
||||||
|
|
|
@ -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<SavedPost> {
|
||||||
|
private val delegateSerializer = ListSerializer(String.serializer())
|
||||||
|
override val descriptor: SerialDescriptor =
|
||||||
|
buildClassSerialDescriptor("SavedPost") {
|
||||||
|
element<String>("shortId")
|
||||||
|
element<String>("title")
|
||||||
|
element<String>("url")
|
||||||
|
element<String>("createdAt")
|
||||||
|
element<Int?>("commentCount", isOptional = true)
|
||||||
|
element<String>("commentsUrl")
|
||||||
|
element<String>("submitterName")
|
||||||
|
element<String>("submitterAvatarUrl")
|
||||||
|
element<List<String>>("tags")
|
||||||
|
element<String>("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<String>()
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue