diff --git a/README.md b/README.md index f714b19..50c1316 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,27 @@ counter.isValid() counter.messages() ``` +### Serialization + +A value manager can be encoded or decoded using Kotlin Serialization and `serialization` module. +It is a good use case whether you have model shared with serialization infrastructure as network requests + +```kotlin +import dev.programadorthi.state.serialization.ValueManager // Not from core package + +@Serializable +data class MyClass( + val count: ValueManager, +) + +val data = MyClass(count = basicValueManager(1)) +val json = Json.encodeToString(data) +println(json) // {"count": 1} + +val decoded = Json.decodeFromString(json) +println(data == decoded) // true +``` + ### State Restoration #### Compose diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 62cabcb..9eb9906 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -1,6 +1,5 @@ plugins { kotlin("multiplatform") - kotlin("plugin.serialization") id("com.android.library") id("com.vanniktech.maven.publish") } @@ -15,18 +14,6 @@ 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") diff --git a/core/common/src/dev/programadorthi/state/core/ValueManager.kt b/core/common/src/dev/programadorthi/state/core/ValueManager.kt index 8ab9092..647499d 100644 --- a/core/common/src/dev/programadorthi/state/core/ValueManager.kt +++ b/core/common/src/dev/programadorthi/state/core/ValueManager.kt @@ -4,11 +4,8 @@ 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 : AutoCloseable { public val closed: Boolean diff --git a/core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt b/core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt index b1f80a6..f0a61f6 100644 --- a/core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt +++ b/core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt @@ -4,8 +4,6 @@ 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 @@ -191,25 +189,4 @@ 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(json) - - assertEquals( - """{"intValue":1,"stringValue":"valueManager","color":{"name":"red"},"composite":[{"name":"blue"},{"name":"green"}]}""", - json - ) - assertEquals(data, decoded) - } } \ No newline at end of file diff --git a/serialization/build.gradle.kts b/serialization/build.gradle.kts new file mode 100644 index 0000000..f11ef0a --- /dev/null +++ b/serialization/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + kotlin("multiplatform") + kotlin("plugin.serialization") + id("com.vanniktech.maven.publish") +} + +applyBasicSetup() + +darwinTargetsFramework() + +kotlin { + sourceSets { + commonMain { + dependencies { + api(project(":core")) + implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.6.3") + } + } + + commonTest { + dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") + } + } + } +} diff --git a/serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializable.kt b/serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializable.kt new file mode 100644 index 0000000..c7880a7 --- /dev/null +++ b/serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializable.kt @@ -0,0 +1,6 @@ +package dev.programadorthi.state.serialization + +import dev.programadorthi.state.core.ValueManager +import kotlinx.serialization.Serializable + +public typealias ValueManager = @Serializable(with = ValueManagerSerializer::class) ValueManager \ No newline at end of file diff --git a/core/common/src/dev/programadorthi/state/core/serialization/ValueManagerSerializer.kt b/serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializer.kt similarity index 93% rename from core/common/src/dev/programadorthi/state/core/serialization/ValueManagerSerializer.kt rename to serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializer.kt index 35ab7fa..984a5cd 100644 --- a/core/common/src/dev/programadorthi/state/core/serialization/ValueManagerSerializer.kt +++ b/serialization/common/src/dev/programadorthi/state/serialization/ValueManagerSerializer.kt @@ -1,4 +1,4 @@ -package dev.programadorthi.state.core.serialization +package dev.programadorthi.state.serialization import dev.programadorthi.state.core.ValueManager import dev.programadorthi.state.core.extension.basicValueManager diff --git a/core/common/test/dev/programadorthi/state/core/SerializableValueManager.kt b/serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManager.kt similarity index 87% rename from core/common/test/dev/programadorthi/state/core/SerializableValueManager.kt rename to serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManager.kt index 1be4e15..cc16c53 100644 --- a/core/common/test/dev/programadorthi/state/core/SerializableValueManager.kt +++ b/serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManager.kt @@ -1,4 +1,4 @@ -package dev.programadorthi.state.core +package dev.programadorthi.state.serialization import kotlinx.serialization.Serializable diff --git a/serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManagerTest.kt b/serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManagerTest.kt new file mode 100644 index 0000000..029c0e4 --- /dev/null +++ b/serialization/common/test/dev/programadorthi/state/serialization/SerializableValueManagerTest.kt @@ -0,0 +1,31 @@ +package dev.programadorthi.state.serialization + +import dev.programadorthi.state.core.extension.basicValueManager +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.Json + +internal class SerializableValueManagerTest { + + @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) + val decoded = Json.decodeFromString(json) + + assertEquals( + """{"intValue":1,"stringValue":"valueManager","color":{"name":"red"},"composite":[{"name":"blue"},{"name":"green"}]}""", + json + ) + assertEquals(data, decoded) + } + +} \ No newline at end of file diff --git a/serialization/gradle.properties b/serialization/gradle.properties new file mode 100644 index 0000000..8f32d07 --- /dev/null +++ b/serialization/gradle.properties @@ -0,0 +1,2 @@ +POM_NAME=Serialization +POM_ARTIFACT_ID=serialization \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 2e2fd8d..880aca9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -22,6 +22,7 @@ rootProject.name = "kotlin-state-manager" include("compose") include("core") include("coroutines") +include("serialization") include("validators") include(":samples:compose:norris-facts:android")