Skip to content

Commit

Permalink
feat: value manager serializable support
Browse files Browse the repository at this point in the history
  • Loading branch information
programadorthi committed Mar 3, 2024
1 parent a4b0afb commit 1740f08
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 0 deletions.
13 changes: 13 additions & 0 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
plugins {
kotlin("multiplatform")
kotlin("plugin.serialization")
id("com.android.library")
id("com.vanniktech.maven.publish")
}
Expand All @@ -14,6 +15,18 @@ kotlin {
}

sourceSets {
commonMain {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3")
}
}

commonTest {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3")
}
}

androidMain {
dependencies {
implementation("androidx.activity:activity-ktx:1.8.2")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,11 @@ public abstract class BaseValueManager<T>(
}.onFailure(::notifyError)
}

override fun equals(other: Any?): Boolean =
other is ValueManager<*> && other.value == value

override fun hashCode(): Int = value?.hashCode() ?: 0

override fun component1(): T = value

override fun component2(): (T) -> Unit = { value = it }
Expand Down
3 changes: 3 additions & 0 deletions core/common/src/dev/programadorthi/state/core/ValueManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@ import dev.programadorthi.state.core.action.ChangeAction
import dev.programadorthi.state.core.action.CollectAction
import dev.programadorthi.state.core.action.ErrorAction
import dev.programadorthi.state.core.action.UpdateAction
import dev.programadorthi.state.core.serialization.ValueManagerSerializer
import kotlinx.serialization.Serializable

@OptIn(ExperimentalStdlibApi::class)
@Serializable(with = ValueManagerSerializer::class)
public interface ValueManager<T> : AutoCloseable {
public val closed: Boolean

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package dev.programadorthi.state.core.serialization

import dev.programadorthi.state.core.ValueManager
import dev.programadorthi.state.core.extension.basicValueManager
import kotlinx.serialization.KSerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

internal class ValueManagerSerializer<T>(
private val valueSerializer: KSerializer<T>
) : KSerializer<ValueManager<T>> {

override val descriptor: SerialDescriptor = valueSerializer.descriptor

override fun deserialize(decoder: Decoder): ValueManager<T> {
val value = valueSerializer.deserialize(decoder)
return basicValueManager(value)
}

override fun serialize(encoder: Encoder, value: ValueManager<T>) {
valueSerializer.serialize(encoder, value.value)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package dev.programadorthi.state.core

import kotlinx.serialization.Serializable

@Serializable
internal data class Color(val name: String)

@Serializable
internal data class SerializableValueManager(
val intValue: ValueManager<Int>,
val stringValue: ValueManager<String>,
val color: ValueManager<Color>,
val composite: ValueManager<ValueManager<List<Color>>>
)
23 changes: 23 additions & 0 deletions core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import dev.programadorthi.state.core.extension.basicValueManager
import dev.programadorthi.state.core.extension.getValue
import dev.programadorthi.state.core.extension.setValue
import dev.programadorthi.state.core.validation.Validator
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlin.random.Random
import kotlin.test.Test
import kotlin.test.assertContentEquals
Expand Down Expand Up @@ -189,4 +191,25 @@ internal class ValueManagerTest {
assertEquals("Value -1 should be positive", manager.messages.first())
assertEquals(0, manager.value, "Value should be equals to initial value")
}

@Test
fun shouldSerializeAndDeserialize() {
val data = SerializableValueManager(
intValue = basicValueManager(1),
stringValue = basicValueManager("valueManager"),
color = basicValueManager(Color("red")),
composite = basicValueManager(
basicValueManager(listOf(Color("blue"), Color("green")))
)
)
val json = Json.encodeToString(data)
println(json)
val decoded = Json.decodeFromString<SerializableValueManager>(json)

assertEquals(
"""{"intValue":1,"stringValue":"valueManager","color":{"name":"red"},"composite":[{"name":"blue"},{"name":"green"}]}""",
json
)
assertEquals(data, decoded)
}
}

0 comments on commit 1740f08

Please sign in to comment.