Skip to content

Commit a4a7150

Browse files
committed
Use named arguments for settings
1 parent 0d252b5 commit a4a7150

File tree

20 files changed

+192
-183
lines changed

20 files changed

+192
-183
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,14 @@ citiesRef.where {
210210
}
211211
```
212212

213+
<h3><a href="https://kotlinlang.org/docs/reference/functions.html#named-arguments">Named arguments</a></h3>
214+
215+
To improve readability functions such as the Cloud Firestore data encoding/decoding use named arguments:
216+
217+
```kotlin
218+
documentRef.set(data, encodeDefaults = false, serializersModule = customSerializerModule)
219+
```
220+
213221
<h3><a href="https://kotlinlang.org/docs/reference/operator-overloading.html">Operator overloading</a></h3>
214222

215223
In cases where it makes sense, such as Firebase Functions HTTPS Callable, operator overloading is used:

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@ import kotlinx.serialization.modules.EmptySerializersModule
1515
import kotlinx.serialization.modules.SerializersModule
1616
import kotlinx.serialization.serializer
1717

18-
inline fun <reified T> decode(value: Any?): T = decode(value, DecodeSettings())
19-
inline fun <reified T> decode(value: Any?, settings: DecodeSettings): T {
18+
inline fun <reified T> decode(value: Any?, serializersModule: SerializersModule = EmptySerializersModule()): T {
2019
val strategy = serializer<T>()
21-
return decode(strategy as DeserializationStrategy<T>, value, settings)
20+
return decode(strategy as DeserializationStrategy<T>, value, serializersModule)
2221
}
23-
fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?): T = decode(strategy, value, DecodeSettings())
24-
fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?, settings: DecodeSettings): T {
22+
fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?, serializersModule: SerializersModule = EmptySerializersModule()): T {
2523
require(value != null || strategy.descriptor.isNullable) { "Value was null for non-nullable type ${strategy.descriptor.serialName}" }
26-
return FirebaseDecoder(value, settings).decodeSerializableValue(strategy)
24+
return FirebaseDecoder(value, DecodeSettings(serializersModule)).decodeSerializableValue(strategy)
2725
}
2826
expect fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder
2927
expect fun getPolymorphicType(value: Any?, discriminator: String): String

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ package dev.gitlive.firebase
77
import kotlinx.serialization.*
88
import kotlinx.serialization.descriptors.*
99
import kotlinx.serialization.encoding.*
10+
import kotlinx.serialization.modules.EmptySerializersModule
1011
import kotlinx.serialization.modules.SerializersModule
1112

12-
fun <T> encode(strategy: SerializationStrategy<T>, value: T, shouldEncodeElementDefault: Boolean): Any? = encode(strategy, value, EncodeSettings(shouldEncodeElementDefault))
13+
fun <T> encode(strategy: SerializationStrategy<T>, value: T, shouldEncodeElementDefault: Boolean, serializersModule: SerializersModule = EmptySerializersModule()): Any? = encode(strategy, value, EncodeSettings(shouldEncodeElementDefault, serializersModule))
1314

1415
fun <T> encode(strategy: SerializationStrategy<T>, value: T, settings: EncodeSettings): Any? =
1516
FirebaseEncoder(settings).apply { encodeSerializableValue(strategy, value) }.value
1617

17-
inline fun <reified T> encode(value: T, shouldEncodeElementDefault: Boolean): Any? = encode(value, EncodeSettings(shouldEncodeElementDefault))
18+
inline fun <reified T> encode(value: T, shouldEncodeElementDefault: Boolean, serializersModule: SerializersModule = EmptySerializersModule()): Any? = encode(value, EncodeSettings(shouldEncodeElementDefault, serializersModule))
1819
inline fun <reified T> encode(value: T, settings: EncodeSettings): Any? = value?.let {
1920
FirebaseEncoder(settings).apply {
2021
if (it is ValueWithSerializer<*> && it.value is T) {
@@ -42,7 +43,7 @@ class FirebaseEncoder(
4243
internal val settings: EncodeSettings
4344
) : Encoder {
4445

45-
// constructor(shouldEncodeElementDefault: Boolean) : this(EncodeSettings(shouldEncodeElementDefault))
46+
constructor(shouldEncodeElementDefault: Boolean, serializersModule: SerializersModule = EmptySerializersModule()) : this(EncodeSettings(shouldEncodeElementDefault, serializersModule))
4647

4748
var value: Any? = null
4849

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ class EncodersTest {
145145

146146
nativeAssertEquals(nativeMapOf("type" to "implemented", "value" to "value", "otherValue" to true), encoded)
147147

148-
val decoded = decode(AbstractClass.serializer(), encoded, DecodeSettings(module))
148+
val decoded = decode(AbstractClass.serializer(), encoded, module)
149149
assertEquals(abstractClass, decoded)
150150
}
151151

@@ -174,7 +174,7 @@ class EncodersTest {
174174
encoded
175175
)
176176

177-
val decoded = decode(NestedClass.serializer(), encoded, DecodeSettings(module))
177+
val decoded = decode(NestedClass.serializer(), encoded, module)
178178
assertEquals(nestedClass, decoded)
179179
}
180180
}

firebase-crashlytics/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@gitlive/firebase-crashlytics",
3-
"version": "1.11.4",
3+
"version": "1.11.0",
44
"description": "Wrapper around firebase for usage in Kotlin Multiplatform projects",
55
"main": "firebase-crashlytics.js",
66
"scripts": {

firebase-database/src/androidMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import kotlinx.coroutines.flow.*
1616
import kotlinx.coroutines.tasks.await
1717
import kotlinx.serialization.DeserializationStrategy
1818
import kotlinx.serialization.KSerializer
19+
import kotlinx.serialization.modules.SerializersModule
1920
import java.util.*
2021
import kotlin.time.Duration.Companion.seconds
2122

@@ -183,22 +184,22 @@ actual class DatabaseReference internal constructor(
183184
.run { Unit }
184185

185186
@Suppress("UNCHECKED_CAST")
186-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
187-
android.updateChildren(encode(update, encodeSettings) as Map<String, Any?>)
187+
override suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean, serializersModule: SerializersModule) =
188+
android.updateChildren(encode(update, encodeDefaults, serializersModule) as Map<String, Any?>)
188189
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
189190
.run { Unit }
190191

191192
actual suspend fun removeValue() = android.removeValue()
192193
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
193194
.run { Unit }
194195

195-
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings, transactionUpdate: (currentData: T) -> T): DataSnapshot {
196+
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, serializersModule: SerializersModule, transactionUpdate: (currentData: T) -> T): DataSnapshot {
196197
val deferred = CompletableDeferred<DataSnapshot>()
197198
android.runTransaction(object : Transaction.Handler {
198199

199200
override fun doTransaction(currentData: MutableData): Transaction.Result {
200201
currentData.value = currentData.value?.let {
201-
transactionUpdate(decode(strategy, it, decodeSettings))
202+
transactionUpdate(decode(strategy, it, serializersModule))
202203
}
203204
return Transaction.success(currentData)
204205
}
@@ -236,8 +237,8 @@ actual class DataSnapshot internal constructor(
236237
actual inline fun <reified T> value() =
237238
decode<T>(value = android.value)
238239

239-
actual fun <T> value(strategy: DeserializationStrategy<T>, decodeSettings: DecodeSettings) =
240-
decode(strategy, android.value, decodeSettings)
240+
actual fun <T> value(strategy: DeserializationStrategy<T>, serializersModule: SerializersModule) =
241+
decode(strategy, android.value, serializersModule)
241242

242243
actual fun child(path: String) = DataSnapshot(android.child(path), persistenceEnabled)
243244
actual val hasChildren get() = android.hasChildren()
@@ -262,8 +263,8 @@ actual class OnDisconnect internal constructor(
262263
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
263264
.run { Unit }
264265

265-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
266-
android.updateChildren(update.mapValues { (_, it) -> encode(it, encodeSettings) })
266+
override suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean, serializersModule: SerializersModule) =
267+
android.updateChildren(update.mapValues { (_, it) -> encode(it, encodeDefaults, serializersModule) })
267268
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
268269
.run { Unit }
269270
}

firebase-database/src/commonMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@
44

55
package dev.gitlive.firebase.database
66

7-
import dev.gitlive.firebase.DecodeSettings
8-
import dev.gitlive.firebase.EncodeSettings
97
import dev.gitlive.firebase.Firebase
108
import dev.gitlive.firebase.FirebaseApp
11-
import dev.gitlive.firebase.database.ChildEvent.Type.*
9+
import dev.gitlive.firebase.database.ChildEvent.Type.ADDED
10+
import dev.gitlive.firebase.database.ChildEvent.Type.CHANGED
11+
import dev.gitlive.firebase.database.ChildEvent.Type.MOVED
12+
import dev.gitlive.firebase.database.ChildEvent.Type.REMOVED
1213
import dev.gitlive.firebase.encode
1314
import kotlinx.coroutines.flow.Flow
1415
import kotlinx.serialization.DeserializationStrategy
1516
import kotlinx.serialization.KSerializer
1617
import kotlinx.serialization.SerializationStrategy
18+
import kotlinx.serialization.modules.EmptySerializersModule
19+
import kotlinx.serialization.modules.SerializersModule
1720

1821
/** Returns the [FirebaseDatabase] instance of the default [FirebaseApp]. */
1922
expect val Firebase.database: FirebaseDatabase
@@ -70,17 +73,13 @@ expect open class Query internal constructor(nativeQuery: NativeQuery) {
7073
}
7174

7275
abstract class BaseDatabaseReference internal constructor(nativeQuery: NativeQuery) : Query(nativeQuery) {
73-
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
74-
setValue(value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
75-
suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings = EncodeSettings()) =
76-
setValueEncoded(encode(value, encodeSettings))
77-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
78-
setValue(strategy, value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
79-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings()) = setValueEncoded(encode(strategy, value, encodeSettings))
76+
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule()) =
77+
setValueEncoded(encode(value, encodeDefaults, serializersModule))
78+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule()) =
79+
setValueEncoded(encode(strategy, value, encodeDefaults, serializersModule))
8080

8181
abstract suspend fun setValueEncoded(encodedValue: Any?)
82-
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
83-
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
82+
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule())
8483
}
8584

8685
expect class DatabaseReference : BaseDatabaseReference {
@@ -91,7 +90,7 @@ expect class DatabaseReference : BaseDatabaseReference {
9190

9291
suspend fun removeValue()
9392

94-
suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings = DecodeSettings(), transactionUpdate: (currentData: T) -> T): DataSnapshot
93+
suspend fun <T> runTransaction(strategy: KSerializer<T>, serializersModule: SerializersModule = EmptySerializersModule(), transactionUpdate: (currentData: T) -> T): DataSnapshot
9594
}
9695

9796
expect class DataSnapshot {
@@ -100,7 +99,7 @@ expect class DataSnapshot {
10099
val ref: DatabaseReference
101100
val value: Any?
102101
inline fun <reified T> value(): T
103-
fun <T> value(strategy: DeserializationStrategy<T>, decodeSettings: DecodeSettings = DecodeSettings()): T
102+
fun <T> value(strategy: DeserializationStrategy<T>, serializersModule: SerializersModule = EmptySerializersModule()): T
104103
fun child(path: String): DataSnapshot
105104
val hasChildren: Boolean
106105
val children: Iterable<DataSnapshot>
@@ -109,17 +108,13 @@ expect class DataSnapshot {
109108
expect class DatabaseException(message: String?, cause: Throwable?) : RuntimeException
110109

111110
abstract class BaseOnDisconnect internal constructor() {
112-
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean) =
113-
setValue(value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
114-
suspend inline fun <reified T> setValue(value: T?, encodeSettings: EncodeSettings = EncodeSettings()) =
115-
setValue(encode(value, encodeSettings))
116-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
117-
setValue(strategy, value, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
118-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings = EncodeSettings()) = setValue(encode(strategy, value, encodeSettings))
111+
suspend inline fun <reified T> setValue(value: T?, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule()) =
112+
setValue(encode(value, encodeDefaults, serializersModule))
113+
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule()) =
114+
setValue(encode(strategy, value, encodeDefaults, serializersModule))
119115
abstract suspend fun setValue(encodedValue: Any?)
120116

121-
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings = EncodeSettings())
122-
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update, EncodeSettings(shouldEncodeElementDefault = encodeDefaults))
117+
abstract suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean = true, serializersModule: SerializersModule = EmptySerializersModule())
123118
}
124119

125120
expect class OnDisconnect : BaseOnDisconnect {

firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import kotlinx.coroutines.selects.select
2020
import kotlinx.serialization.DeserializationStrategy
2121
import kotlinx.serialization.KSerializer
2222
import kotlinx.serialization.SerializationStrategy
23+
import kotlinx.serialization.modules.EmptySerializersModule
24+
import kotlinx.serialization.modules.SerializersModule
2325
import platform.Foundation.NSError
2426
import platform.Foundation.allObjects
2527
import kotlin.collections.component1
@@ -150,21 +152,24 @@ actual class DatabaseReference internal constructor(
150152
ios.await(persistenceEnabled) { setValue(encodedValue, it) }
151153
}
152154

153-
@Suppress("UNCHECKED_CAST")
154-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
155-
ios.await(persistenceEnabled) { updateChildValues(encode(update, encodeSettings) as Map<Any?, *>, it) }
155+
override suspend fun updateChildren(
156+
update: Map<String, Any?>,
157+
encodeDefaults: Boolean,
158+
serializersModule: SerializersModule
159+
) {
160+
ios.await(persistenceEnabled) { updateChildValues(encode(update, encodeDefaults, serializersModule) as Map<Any?, *>, it) }
156161
}
157162

158163
actual suspend fun removeValue() {
159164
ios.await(persistenceEnabled) { removeValueWithCompletionBlock(it) }
160165
}
161166

162-
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings, transactionUpdate: (currentData: T) -> T): DataSnapshot {
167+
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, serializersModule: SerializersModule, transactionUpdate: (currentData: T) -> T): DataSnapshot {
163168
val deferred = CompletableDeferred<DataSnapshot>()
164169
ios.runTransactionBlock(
165170
block = { firMutableData ->
166171
firMutableData?.value = firMutableData?.value?.let {
167-
transactionUpdate(decode(strategy, it, decodeSettings))
172+
transactionUpdate(decode(strategy, it, serializersModule))
168173
}
169174
FIRTransactionResult.successWithValue(firMutableData!!)
170175
},
@@ -198,8 +203,8 @@ actual class DataSnapshot internal constructor(
198203
actual inline fun <reified T> value() =
199204
decode<T>(value = ios.value)
200205

201-
actual fun <T> value(strategy: DeserializationStrategy<T>, decodeSettings: DecodeSettings) =
202-
decode(strategy, ios.value, decodeSettings)
206+
actual fun <T> value(strategy: DeserializationStrategy<T>, serializersModule: SerializersModule) =
207+
decode(strategy, ios.value, serializersModule)
203208

204209
actual fun child(path: String) = DataSnapshot(ios.childSnapshotForPath(path), persistenceEnabled)
205210
actual val hasChildren get() = ios.hasChildren()
@@ -223,8 +228,12 @@ actual class OnDisconnect internal constructor(
223228
}
224229

225230
@Suppress("UNCHECKED_CAST")
226-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) {
227-
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(update.mapValues { (_, it) -> encode(it, encodeSettings) } as Map<Any?, *>, it) }
231+
override suspend fun updateChildren(
232+
update: Map<String, Any?>,
233+
encodeDefaults: Boolean,
234+
serializersModule: SerializersModule
235+
) {
236+
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(update.mapValues { (_, it) -> encode(it, encodeDefaults, serializersModule) } as Map<Any?, *>, it) }
228237
}
229238
}
230239

firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import kotlinx.coroutines.flow.produceIn
1515
import kotlinx.coroutines.selects.select
1616
import kotlinx.serialization.DeserializationStrategy
1717
import kotlinx.serialization.KSerializer
18+
import kotlinx.serialization.modules.SerializersModule
1819
import kotlin.js.Promise
1920
import kotlin.js.json
2021
import dev.gitlive.firebase.database.externals.DataSnapshot as JsDataSnapshot
@@ -152,11 +153,11 @@ actual class DatabaseReference internal constructor(
152153
set(js, encodedValue).awaitWhileOnline(database)
153154
}
154155

155-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
156-
rethrow { update(js, encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
156+
override suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean, serializersModule: SerializersModule) =
157+
rethrow { update(js, encode(update, encodeDefaults, serializersModule) ?: json()).awaitWhileOnline(database) }
157158

158159

159-
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, decodeSettings: DecodeSettings, transactionUpdate: (currentData: T) -> T): DataSnapshot {
160+
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, serializersModule: SerializersModule, transactionUpdate: (currentData: T) -> T): DataSnapshot {
160161
return DataSnapshot(jsRunTransaction(js, transactionUpdate).awaitWhileOnline(database).snapshot, database)
161162
}
162163
}
@@ -173,8 +174,8 @@ actual class DataSnapshot internal constructor(
173174
actual inline fun <reified T> value() =
174175
rethrow { decode<T>(value = js.`val`()) }
175176

176-
actual fun <T> value(strategy: DeserializationStrategy<T>, decodeSettings: DecodeSettings) =
177-
rethrow { decode(strategy, js.`val`(), decodeSettings) }
177+
actual fun <T> value(strategy: DeserializationStrategy<T>, serializersModule: SerializersModule) =
178+
rethrow { decode(strategy, js.`val`(), serializersModule) }
178179

179180
actual val exists get() = rethrow { js.exists() }
180181
actual val key get() = rethrow { js.key }
@@ -201,8 +202,8 @@ actual class OnDisconnect internal constructor(
201202
override suspend fun setValue(encodedValue: Any?) =
202203
rethrow { js.set(encodedValue).awaitWhileOnline(database) }
203204

204-
override suspend fun updateChildren(update: Map<String, Any?>, encodeSettings: EncodeSettings) =
205-
rethrow { js.update(encode(update, encodeSettings) ?: json()).awaitWhileOnline(database) }
205+
override suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean, serializersModule: SerializersModule) =
206+
rethrow { js.update(encode(update, encodeDefaults, serializersModule) ?: json()).awaitWhileOnline(database) }
206207

207208
}
208209

0 commit comments

Comments
 (0)