Skip to content

Commit 59b4522

Browse files
committed
Some renames + readme update
1 parent 3021502 commit 59b4522

File tree

10 files changed

+147
-111
lines changed

10 files changed

+147
-111
lines changed

README.md

+31-4
Original file line numberDiff line numberDiff line change
@@ -85,16 +85,43 @@ data class City(val name: String)
8585
Instances of these classes can now be passed [along with their serializer](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#introduction-to-serializers) to the SDK:
8686

8787
```kotlin
88-
db.collection("cities").document("LA").set(City.serializer(), city) { shouldEncodeElementDefault = true }
88+
db.collection("cities").document("LA").set(City.serializer(), city) { encodeDefaults = true }
8989
```
9090

9191
The `buildSettings` closure is optional and allows for configuring serialization behaviour.
9292

93-
Setting the `shouldEncodeElementDefault` parameter is optional and defaults to `true`, set this to false to omit writing optional properties if they are equal to theirs default values.
93+
Setting the `encodeDefaults` parameter is optional and defaults to `true`, set this to false to omit writing optional properties if they are equal to theirs default values.
9494
Using [@EncodeDefault](https://kotlinlang.org/api/kotlinx.serialization/kotlinx-serialization-core/kotlinx.serialization/-encode-default/) on properties is a recommended way to locally override the behavior set with `encodeDefaults`.
9595

96-
You can also omit the serializer but this is discouraged due to a [current limitation on Kotlin/JS and Kotlin/Native](https://github.com/Kotlin/kotlinx.serialization/issues/1116#issuecomment-704342452).
97-
To support [contextual serialization](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#contextual-serialization) or [open polymorphism](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#open-polymorphism) the `serializersModule` can be overridden in any `EncodeSettings` or `DecodeSettings`
96+
You can also omit the serializer if it can be inferred using `serializer<KType>()`.
97+
To support [contextual serialization](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/serializers.md#contextual-serialization) or [open polymorphism](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#open-polymorphism) the `serializersModule` can be overridden in the `buildSettings` closure:
98+
99+
```kotlin
100+
@Serializable
101+
abstract class AbstractCity {
102+
abstract val name: String
103+
}
104+
105+
@Serializable
106+
@SerialName("capital")
107+
data class Capital(override val name: String, val isSeatOfGovernment: Boolean) : AbstractCity()
108+
109+
val module = SerializersModule {
110+
polymorphic(AbstractCity::class, AbstractCity.serializer()) {
111+
subclass(Capital::class, Capital.serializer())
112+
}
113+
}
114+
115+
val city = Capital("London", true)
116+
db.collection("cities").document("UK").set(AbstractCity.serializer(), city) {
117+
encodeDefaults = true
118+
serializersModule = module
119+
120+
}
121+
val storedCity = db.collection("cities").document("UK").get().data(AbstractCity.serializer()) {
122+
serializersModule = module
123+
}
124+
```
98125

99126
<h4><a href="https://firebase.google.com/docs/firestore/manage-data/add-data#server_timestamp">Server Timestamp</a></h3>
100127

firebase-common/src/commonMain/kotlin/dev/gitlive/firebase/EncodeDecodeSettings.kt

+6-6
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,23 @@ sealed class EncodeDecodeSettings {
1616

1717
/**
1818
* [EncodeDecodeSettings] used when encoding an object
19-
* @property shouldEncodeElementDefault if `true` this will explicitly encode elements even if they are their default value
19+
* @property encodeDefaults if `true` this will explicitly encode elements even if they are their default value
2020
* @param serializersModule the [SerializersModule] to use for serialization. This allows for polymorphic serialization on runtime
2121
*/
2222
data class EncodeSettings internal constructor(
23-
val shouldEncodeElementDefault: Boolean,
23+
val encodeDefaults: Boolean,
2424
override val serializersModule: SerializersModule,
2525
) : EncodeDecodeSettings() {
2626

2727
interface Builder {
28-
var shouldEncodeElementDefault: Boolean
28+
var encodeDefaults: Boolean
2929
var serializersModule: SerializersModule
3030

3131
}
3232

3333
@PublishedApi
3434
internal class BuilderImpl : Builder {
35-
override var shouldEncodeElementDefault: Boolean = true
35+
override var encodeDefaults: Boolean = true
3636
override var serializersModule: SerializersModule = EmptySerializersModule()
3737
}
3838
}
@@ -60,11 +60,11 @@ interface EncodeDecodeSettingsBuilder : EncodeSettings.Builder, DecodeSettings.B
6060
@PublishedApi
6161
internal class EncodeDecodeSettingsBuilderImpl : EncodeDecodeSettingsBuilder {
6262

63-
override var shouldEncodeElementDefault: Boolean = true
63+
override var encodeDefaults: Boolean = true
6464
override var serializersModule: SerializersModule = EmptySerializersModule()
6565
}
6666

6767
@PublishedApi
68-
internal fun EncodeSettings.Builder.buildEncodeSettings(): EncodeSettings = EncodeSettings(shouldEncodeElementDefault, serializersModule)
68+
internal fun EncodeSettings.Builder.buildEncodeSettings(): EncodeSettings = EncodeSettings(encodeDefaults, serializersModule)
6969
@PublishedApi
7070
internal fun DecodeSettings.Builder.buildDecodeSettings(): DecodeSettings = DecodeSettings(serializersModule)

firebase-common/src/commonMain/kotlin/dev/gitlive/firebase/encoders.kt

+7-7
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import kotlinx.serialization.encoding.CompositeEncoder
1111
import kotlinx.serialization.encoding.Encoder
1212
import kotlinx.serialization.modules.SerializersModule
1313

14-
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(strategy, value) { this.shouldEncodeElementDefault = shouldEncodeElementDefault }"))
14+
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(strategy, value) { encodeDefaults = shouldEncodeElementDefault }"))
1515
fun <T> encode(strategy: SerializationStrategy<T>, value: T, shouldEncodeElementDefault: Boolean): Any? = encode(strategy, value) {
16-
this.shouldEncodeElementDefault = shouldEncodeElementDefault
16+
this.encodeDefaults = shouldEncodeElementDefault
1717
}
1818

1919
inline fun <T> encode(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit) =
@@ -23,9 +23,9 @@ inline fun <T> encode(strategy: SerializationStrategy<T>, value: T, buildSetting
2323
internal inline fun <T> encode(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings): Any? =
2424
FirebaseEncoder(encodeSettings).apply { encodeSerializableValue(strategy, value) }.value
2525

26-
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(value) { this.shouldEncodeElementDefault = shouldEncodeElementDefault }"))
26+
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(value) { this.encodeDefaults = shouldEncodeElementDefault }"))
2727
inline fun <reified T> encode(value: T, shouldEncodeElementDefault: Boolean): Any? = encode(value) {
28-
this.shouldEncodeElementDefault = shouldEncodeElementDefault
28+
this.encodeDefaults = shouldEncodeElementDefault
2929
}
3030

3131
inline fun <reified T> encode(value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) =
@@ -60,12 +60,12 @@ class FirebaseEncoder(
6060
) : Encoder {
6161

6262
constructor(shouldEncodeElementDefault: Boolean) : this(
63-
EncodeSettings.BuilderImpl().apply { this.shouldEncodeElementDefault = shouldEncodeElementDefault }.buildEncodeSettings()
63+
EncodeSettings.BuilderImpl().apply { this.encodeDefaults = shouldEncodeElementDefault }.buildEncodeSettings()
6464
)
6565

6666
var value: Any? = null
6767

68-
internal val shouldEncodeElementDefault = settings.shouldEncodeElementDefault
68+
internal val shouldEncodeElementDefault = settings.encodeDefaults
6969
override val serializersModule: SerializersModule = settings.serializersModule
7070

7171
private var polymorphicDiscriminator: String? = null
@@ -154,7 +154,7 @@ open class FirebaseCompositeEncoder constructor(
154154

155155
override fun endStructure(descriptor: SerialDescriptor) = end()
156156

157-
override fun shouldEncodeElementDefault(descriptor: SerialDescriptor, index: Int) = settings.shouldEncodeElementDefault
157+
override fun shouldEncodeElementDefault(descriptor: SerialDescriptor, index: Int) = settings.encodeDefaults
158158

159159
override fun <T : Any> encodeNullableSerializableElement(
160160
descriptor: SerialDescriptor,

firebase-common/src/commonTest/kotlin/dev/gitlive/firebase/EncodersTest.kt

+28-19
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import kotlinx.serialization.builtins.ListSerializer
1010
import kotlinx.serialization.builtins.MapSerializer
1111
import kotlinx.serialization.builtins.serializer
1212
import kotlinx.serialization.modules.SerializersModule
13+
import kotlinx.serialization.modules.polymorphic
1314
import kotlin.test.Test
1415
import kotlin.test.assertEquals
1516

@@ -59,7 +60,7 @@ class EncodersTest {
5960
@Test
6061
fun encodeDecodeList() {
6162
val list = listOf("One", "Two", "Three")
62-
val encoded = encode<List<String>>(list) { shouldEncodeElementDefault = true }
63+
val encoded = encode<List<String>>(list) { encodeDefaults = true }
6364

6465
nativeAssertEquals(nativeListOf("One", "Two", "Three"), encoded)
6566

@@ -70,7 +71,7 @@ class EncodersTest {
7071
@Test
7172
fun encodeDecodeMap() {
7273
val map = mapOf("key" to "value", "key2" to "value2", "key3" to "value3")
73-
val encoded = encode<Map<String, String>>(map) { shouldEncodeElementDefault = true }
74+
val encoded = encode<Map<String, String>>(map) { encodeDefaults = true }
7475

7576
nativeAssertEquals(nativeMapOf("key" to "value", "key2" to "value2", "key3" to "value3"), encoded)
7677

@@ -80,7 +81,7 @@ class EncodersTest {
8081

8182
@Test
8283
fun encodeDecodeObject() {
83-
val encoded = encode(TestObject.serializer(), TestObject) { shouldEncodeElementDefault = false }
84+
val encoded = encode(TestObject.serializer(), TestObject) { encodeDefaults = false }
8485
nativeAssertEquals(nativeMapOf(), encoded)
8586

8687
val decoded = decode(TestObject.serializer(), encoded)
@@ -90,7 +91,7 @@ class EncodersTest {
9091
@Test
9192
fun encodeDecodeClass() {
9293
val testDataClass = TestData(mapOf("key" to "value"), mapOf(1 to 1), true)
93-
val encoded = encode(TestData.serializer(), testDataClass) { shouldEncodeElementDefault = false }
94+
val encoded = encode(TestData.serializer(), testDataClass) { encodeDefaults = false }
9495

9596
nativeAssertEquals(nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true), encoded)
9697

@@ -101,7 +102,7 @@ class EncodersTest {
101102
@Test
102103
fun encodeDecodeClassNullableValue() {
103104
val testDataClass = TestData(mapOf("key" to "value"), mapOf(1 to 1), true, nullableBool = true)
104-
val encoded = encode(TestData.serializer(), testDataClass) { shouldEncodeElementDefault = true }
105+
val encoded = encode(TestData.serializer(), testDataClass) { encodeDefaults = true }
105106

106107
nativeAssertEquals(nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to true), encoded)
107108

@@ -113,7 +114,7 @@ class EncodersTest {
113114
fun encodeDecodeGenericClass() {
114115
val innerClass = TestData(mapOf("key" to "value"), mapOf(1 to 1), true)
115116
val genericClass = GenericClass(innerClass)
116-
val encoded = encode(GenericClass.serializer(TestData.serializer()), genericClass) { shouldEncodeElementDefault = true }
117+
val encoded = encode(GenericClass.serializer(TestData.serializer()), genericClass) { encodeDefaults = true }
117118

118119
nativeAssertEquals(nativeMapOf("inner" to nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to null)), encoded)
119120

@@ -124,7 +125,7 @@ class EncodersTest {
124125
@Test
125126
fun encodeDecodeSealedClass() {
126127
val sealedClass = SealedClass.Test("value")
127-
val encoded = encode(SealedClass.serializer(), sealedClass) { shouldEncodeElementDefault = true }
128+
val encoded = encode(SealedClass.serializer(), sealedClass) { encodeDefaults = true }
128129

129130
nativeAssertEquals(nativeMapOf("type" to "test", "value" to "value"), encoded)
130131

@@ -135,12 +136,14 @@ class EncodersTest {
135136
@Test
136137
fun encodeDecodePolymorphicClass() {
137138
val module = SerializersModule {
138-
polymorphic(AbstractClass::class, ImplementedClass::class, ImplementedClass.serializer())
139+
polymorphic(AbstractClass::class, AbstractClass.serializer()) {
140+
subclass(ImplementedClass::class, ImplementedClass.serializer())
141+
}
139142
}
140143
val abstractClass: AbstractClass = ImplementedClass("value", true)
141144
val encoded =
142145
encode(AbstractClass.serializer(), abstractClass) {
143-
shouldEncodeElementDefault = true
146+
encodeDefaults = true
144147
serializersModule = module
145148
}
146149

@@ -155,14 +158,16 @@ class EncodersTest {
155158
@Test
156159
fun encodeDecodeNestedClass() {
157160
val module = SerializersModule {
158-
polymorphic(AbstractClass::class, ImplementedClass::class, ImplementedClass.serializer())
161+
polymorphic(AbstractClass::class, AbstractClass.serializer()) {
162+
subclass(ImplementedClass::class, ImplementedClass.serializer())
163+
}
159164
}
160165

161166
val sealedClass: SealedClass = SealedClass.Test("value")
162167
val abstractClass: AbstractClass = ImplementedClass("value", true)
163168
val nestedClass = NestedClass(sealedClass, abstractClass, listOf(sealedClass), listOf(abstractClass), mapOf(sealedClass to sealedClass), mapOf(abstractClass to abstractClass))
164169
val encoded = encode(NestedClass.serializer(), nestedClass) {
165-
shouldEncodeElementDefault = true
170+
encodeDefaults = true
166171
serializersModule = module
167172
}
168173

@@ -207,7 +212,7 @@ class EncodersTest {
207212

208213
@Test
209214
fun reencodeTransformationObject() {
210-
val reencoded = reencodeTransformation<TestObject>(nativeMapOf(), { shouldEncodeElementDefault = false }) {
215+
val reencoded = reencodeTransformation<TestObject>(nativeMapOf(), { encodeDefaults = false }) {
211216
assertEquals(TestObject, it)
212217
it
213218
}
@@ -218,7 +223,7 @@ class EncodersTest {
218223
fun reencodeTransformationClass() {
219224
val reencoded = reencodeTransformation<TestData>(
220225
nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to true),
221-
{ shouldEncodeElementDefault = false }
226+
{ encodeDefaults = false }
222227
) {
223228
assertEquals(TestData(mapOf("key" to "value"), mapOf(1 to 1), bool = true, nullableBool = true), it)
224229
it.copy(map = mapOf("newKey" to "newValue"), nullableBool = null)
@@ -231,7 +236,7 @@ class EncodersTest {
231236
fun reencodeTransformationNullableValue() {
232237
val reencoded = reencodeTransformation<TestData?>(
233238
nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to true),
234-
{ shouldEncodeElementDefault = false }
239+
{ encodeDefaults = false }
235240
) {
236241
assertEquals(TestData(mapOf("key" to "value"), mapOf(1 to 1), bool = true, nullableBool = true), it)
237242
null
@@ -245,7 +250,7 @@ class EncodersTest {
245250
val reencoded = reencodeTransformation(
246251
GenericClass.serializer(TestData.serializer()),
247252
nativeMapOf("inner" to nativeMapOf("map" to nativeMapOf("key" to "value"), "otherMap" to nativeMapOf(1 to 1), "bool" to true, "nullableBool" to false)),
248-
{ shouldEncodeElementDefault = false }
253+
{ encodeDefaults = false }
249254
) {
250255
assertEquals(
251256
GenericClass(TestData(mapOf("key" to "value"), mapOf(1 to 1), bool = true, nullableBool = false)),
@@ -270,7 +275,9 @@ class EncodersTest {
270275
@Test
271276
fun reencodeTransformationPolymorphicClass() {
272277
val module = SerializersModule {
273-
polymorphic(AbstractClass::class, ImplementedClass::class, ImplementedClass.serializer())
278+
polymorphic(AbstractClass::class, AbstractClass.serializer()) {
279+
subclass(ImplementedClass::class, ImplementedClass.serializer())
280+
}
274281
}
275282

276283
val reencoded = reencodeTransformation(
@@ -290,19 +297,21 @@ class EncodersTest {
290297
@Test
291298
fun reencodeTransformationNestedClass() {
292299
val module = SerializersModule {
293-
polymorphic(AbstractClass::class, ImplementedClass::class, ImplementedClass.serializer())
300+
polymorphic(AbstractClass::class, AbstractClass.serializer()) {
301+
subclass(ImplementedClass::class, ImplementedClass.serializer())
302+
}
294303
}
295304

296305
val sealedClass: SealedClass = SealedClass.Test("value")
297306
val abstractClass: AbstractClass = ImplementedClass("value", true)
298307
val nestedClass = NestedClass(sealedClass, abstractClass, listOf(sealedClass), listOf(abstractClass), mapOf(sealedClass to sealedClass), mapOf(abstractClass to abstractClass))
299308
val encoded = encode(NestedClass.serializer(), nestedClass) {
300-
shouldEncodeElementDefault = true
309+
encodeDefaults = true
301310
serializersModule = module
302311
}
303312

304313
val reencoded = reencodeTransformation(NestedClass.serializer(), encoded, builder = {
305-
shouldEncodeElementDefault = true
314+
encodeDefaults = true
306315
serializersModule = module
307316
}) {
308317
assertEquals(nestedClass, it)

0 commit comments

Comments
 (0)