Skip to content

Commit

Permalink
feat: serialization module
Browse files Browse the repository at this point in the history
  • Loading branch information
programadorthi committed Mar 4, 2024
1 parent 1740f08 commit 7475731
Show file tree
Hide file tree
Showing 11 changed files with 89 additions and 41 deletions.
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<Int>,
)

val data = MyClass(count = basicValueManager(1))
val json = Json.encodeToString(data)
println(json) // {"count": 1}

val decoded = Json.decodeFromString<MyClass>(json)
println(data == decoded) // true
```

### State Restoration

#### Compose
Expand Down
13 changes: 0 additions & 13 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
plugins {
kotlin("multiplatform")
kotlin("plugin.serialization")
id("com.android.library")
id("com.vanniktech.maven.publish")
}
Expand All @@ -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")
Expand Down
3 changes: 0 additions & 3 deletions core/common/src/dev/programadorthi/state/core/ValueManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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<T> : AutoCloseable {
public val closed: Boolean

Expand Down
23 changes: 0 additions & 23 deletions core/common/test/dev/programadorthi/state/core/ValueManagerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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<SerializableValueManager>(json)

assertEquals(
"""{"intValue":1,"stringValue":"valueManager","color":{"name":"red"},"composite":[{"name":"blue"},{"name":"green"}]}""",
json
)
assertEquals(data, decoded)
}
}
26 changes: 26 additions & 0 deletions serialization/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.programadorthi.state.serialization

import dev.programadorthi.state.core.ValueManager
import kotlinx.serialization.Serializable

public typealias ValueManager<T> = @Serializable(with = ValueManagerSerializer::class) ValueManager<T>
Original file line number Diff line number Diff line change
@@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package dev.programadorthi.state.core
package dev.programadorthi.state.serialization

import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
@@ -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<SerializableValueManager>(json)

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

}
2 changes: 2 additions & 0 deletions serialization/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
POM_NAME=Serialization
POM_ARTIFACT_ID=serialization
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down

0 comments on commit 7475731

Please sign in to comment.