Skip to content

Commit 4ad4d13

Browse files
committed
Remove Async classes + add inline for builder funs
1 parent 3c9f7ff commit 4ad4d13

File tree

19 files changed

+201
-418
lines changed

19 files changed

+201
-418
lines changed

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,6 @@ data class DecodeSettings internal constructor(
4343
class Builder {
4444
var serializersModule: SerializersModule = EmptySerializersModule()
4545

46-
internal fun build() = DecodeSettings(serializersModule)
46+
fun build() = DecodeSettings(serializersModule)
4747
}
4848
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import kotlinx.serialization.modules.SerializersModule
1616
import kotlinx.serialization.serializer
1717

1818
inline fun <reified T> decode(value: Any?): T = decode(value) {}
19-
inline fun <reified T> decode(value: Any?, noinline buildSettings: DecodeSettings.Builder.() -> Unit): T {
19+
inline fun <reified T> decode(value: Any?, buildSettings: DecodeSettings.Builder.() -> Unit): T {
2020
val strategy = serializer<T>()
2121
return decode(strategy as DeserializationStrategy<T>, value, buildSettings)
2222
}
2323
fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?): T = decode(strategy, value) {}
24-
fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?, buildSettings: DecodeSettings.Builder.() -> Unit): T {
24+
inline fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?, buildSettings: DecodeSettings.Builder.() -> Unit): T {
2525
require(value != null || strategy.descriptor.isNullable) { "Value was null for non-nullable type ${strategy.descriptor.serialName}" }
2626
return FirebaseDecoder(value, DecodeSettings.Builder().apply(buildSettings).build()).decodeSerializableValue(strategy)
2727
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ fun <T> encode(strategy: SerializationStrategy<T>, value: T, shouldEncodeElement
1414
this.shouldEncodeElementDefault = shouldEncodeElementDefault
1515
}
1616

17-
fun <T> encode(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit): Any? =
17+
inline fun <T> encode(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit): Any? =
1818
FirebaseEncoder(EncodeSettings.Builder().apply(buildSettings).build()).apply { encodeSerializableValue(strategy, value) }.value
1919

2020
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(value) { this.shouldEncodeElementDefault = shouldEncodeElementDefault }"))

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ actual class DatabaseReference internal constructor(
183183
.run { Unit }
184184

185185
@Suppress("UNCHECKED_CAST")
186-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) =
187-
android.updateChildren(encode(update, buildSettings) as Map<String, Any?>)
186+
override suspend fun updateEncodedChildren(encodedUpdate: Any?) =
187+
android.updateChildren(encodedUpdate as Map<String, Any?>)
188188
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
189189
.run { Unit }
190190

@@ -236,7 +236,7 @@ actual class DataSnapshot internal constructor(
236236
actual inline fun <reified T> value() =
237237
decode<T>(value = android.value)
238238

239-
actual fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit) =
239+
actual inline fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit) =
240240
decode(strategy, android.value, buildSettings)
241241

242242
actual fun child(path: String) = DataSnapshot(android.child(path), persistenceEnabled)
@@ -262,8 +262,8 @@ actual class OnDisconnect internal constructor(
262262
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
263263
.run { Unit }
264264

265-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) =
266-
android.updateChildren(update.mapValues { (_, it) -> encode(it, buildSettings) })
265+
override suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) =
266+
android.updateChildren(encodedUpdate)
267267
.run { if(persistenceEnabled) await() else awaitWhileOnline(database) }
268268
.run { Unit }
269269
}

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

+17-7
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,20 @@ abstract class BaseDatabaseReference internal constructor(nativeQuery: NativeQue
8484
setValue(strategy, value) {
8585
shouldEncodeElementDefault = encodeDefaults
8686
}
87-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValueEncoded(encode(strategy, value, buildSettings))
87+
suspend inline fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValueEncoded(encode(strategy, value, buildSettings))
8888

89-
abstract suspend fun setValueEncoded(encodedValue: Any?)
89+
@PublishedApi
90+
internal abstract suspend fun setValueEncoded(encodedValue: Any?)
9091

9192
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("updateChildren(update) { shouldEncodeElementDefault = encodeDefaults }"))
9293
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update) {
9394
shouldEncodeElementDefault = encodeDefaults
9495
}
95-
abstract suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {})
96+
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = updateEncodedChildren(
97+
encode(update, buildSettings))
98+
99+
@PublishedApi
100+
internal abstract suspend fun updateEncodedChildren(encodedUpdate: Any?)
96101
}
97102

98103
expect class DatabaseReference : BaseDatabaseReference {
@@ -112,7 +117,7 @@ expect class DataSnapshot {
112117
val ref: DatabaseReference
113118
val value: Any?
114119
inline fun <reified T> value(): T
115-
fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit = {}): T
120+
inline fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit = {}): T
116121
fun child(path: String): DataSnapshot
117122
val hasChildren: Boolean
118123
val children: Iterable<DataSnapshot>
@@ -129,14 +134,19 @@ abstract class BaseOnDisconnect internal constructor() {
129134
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("setValue(strategy, value) { shouldEncodeElementDefault = encodeDefaults }"))
130135
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, encodeDefaults: Boolean) =
131136
setValue(strategy, value) { shouldEncodeElementDefault = encodeDefaults }
132-
suspend fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValue(encode(strategy, value, buildSettings))
133-
abstract suspend fun setValue(encodedValue: Any?)
137+
suspend inline fun <T> setValue(strategy: SerializationStrategy<T>, value: T, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = setValue(encode(strategy, value, buildSettings))
138+
139+
@PublishedApi
140+
internal abstract suspend fun setValue(encodedValue: Any?)
134141

135-
abstract suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {})
142+
suspend inline fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit = {}) = updateEncodedChildren(update.mapValues { (_, it) -> encode(it, buildSettings) })
136143
@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("updateChildren(update) { shouldEncodeElementDefault = encodeDefaults }"))
137144
suspend fun updateChildren(update: Map<String, Any?>, encodeDefaults: Boolean) = updateChildren(update) {
138145
shouldEncodeElementDefault = encodeDefaults
139146
}
147+
148+
@PublishedApi
149+
internal abstract suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>)
140150
}
141151

142152
expect class OnDisconnect : BaseOnDisconnect {

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

+5-5
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ actual class DatabaseReference internal constructor(
151151
}
152152

153153
@Suppress("UNCHECKED_CAST")
154-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) {
155-
ios.await(persistenceEnabled) { updateChildValues(encode(update, buildSettings) as Map<Any?, *>, it) }
154+
override suspend fun updateEncodedChildren(encodedValue: Any?) {
155+
ios.await(persistenceEnabled) { updateChildValues(encodedValue as Map<Any?, *>, it) }
156156
}
157157

158158
actual suspend fun removeValue() {
@@ -198,7 +198,7 @@ actual class DataSnapshot internal constructor(
198198
actual inline fun <reified T> value() =
199199
decode<T>(value = ios.value)
200200

201-
actual fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit) =
201+
actual inline fun <T> value(strategy: DeserializationStrategy<T>, buildSettings: DecodeSettings.Builder.() -> Unit) =
202202
decode(strategy, ios.value, buildSettings)
203203

204204
actual fun child(path: String) = DataSnapshot(ios.childSnapshotForPath(path), persistenceEnabled)
@@ -223,8 +223,8 @@ actual class OnDisconnect internal constructor(
223223
}
224224

225225
@Suppress("UNCHECKED_CAST")
226-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) {
227-
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(update.mapValues { (_, it) -> encode(it, buildSettings) } as Map<Any?, *>, it) }
226+
override suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) {
227+
ios.await(persistenceEnabled) { onDisconnectUpdateChildValues(encodedUpdate as Map<Any?, *>, it) }
228228
}
229229
}
230230

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,8 @@ actual class DatabaseReference internal constructor(
152152
set(js, encodedValue).awaitWhileOnline(database)
153153
}
154154

155-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) =
156-
rethrow { update(js, encode(update, buildSettings) ?: json()).awaitWhileOnline(database) }
155+
override suspend fun updateEncodedChildren(encodedUpdate: Any?) =
156+
rethrow { update(js, encodedUpdate ?: json()).awaitWhileOnline(database) }
157157

158158

159159
actual suspend fun <T> runTransaction(strategy: KSerializer<T>, buildSettings: DecodeSettings.Builder.() -> Unit, transactionUpdate: (currentData: T) -> T): DataSnapshot {
@@ -201,8 +201,8 @@ actual class OnDisconnect internal constructor(
201201
override suspend fun setValue(encodedValue: Any?) =
202202
rethrow { js.set(encodedValue).awaitWhileOnline(database) }
203203

204-
override suspend fun updateChildren(update: Map<String, Any?>, buildSettings: EncodeSettings.Builder.() -> Unit) =
205-
rethrow { js.update(encode(update, buildSettings) ?: json()).awaitWhileOnline(database) }
204+
override suspend fun updateEncodedChildren(encodedUpdate: Map<String, Any?>) =
205+
rethrow { js.update(encodedUpdate).awaitWhileOnline(database) }
206206

207207
}
208208

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

+32-46
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@ actual val Firebase.firestore get() =
3030
actual fun Firebase.firestore(app: FirebaseApp) =
3131
FirebaseFirestore(com.google.firebase.firestore.FirebaseFirestore.getInstance(app.android))
3232

33-
@Suppress("DeferredIsResult")
34-
@PublishedApi
35-
internal fun Task<Void>.asUnitDeferred(): Deferred<Unit> = CompletableDeferred<Unit>()
36-
.apply {
37-
asDeferred().invokeOnCompletion { exception ->
38-
if (exception == null) complete(Unit) else completeExceptionally(exception)
39-
}
40-
}
41-
4233
actual class FirebaseFirestore(val android: com.google.firebase.firestore.FirebaseFirestore) {
4334

4435
actual fun collection(collectionPath: String) = CollectionReference(android.collection(collectionPath))
@@ -91,8 +82,6 @@ val SetOptions.android: com.google.firebase.firestore.SetOptions? get() = when (
9182

9283
actual class WriteBatch(val android: com.google.firebase.firestore.WriteBatch) : BaseWriteBatch() {
9384

94-
actual val async = Async(android)
95-
9685
override fun setEncoded(
9786
documentRef: DocumentReference,
9887
encodedData: Any,
@@ -123,11 +112,8 @@ actual class WriteBatch(val android: com.google.firebase.firestore.WriteBatch) :
123112
actual fun delete(documentRef: DocumentReference) =
124113
android.delete(documentRef.android).let { this }
125114

126-
actual suspend fun commit() = async.commit().await()
127-
128-
@Suppress("DeferredIsResult")
129-
actual class Async(private val android: com.google.firebase.firestore.WriteBatch) {
130-
actual fun commit(): Deferred<Unit> = android.commit().asUnitDeferred()
115+
actual suspend fun commit() {
116+
android.commit().await()
131117
}
132118
}
133119

@@ -183,13 +169,40 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
183169
actual val parent: CollectionReference
184170
get() = CollectionReference(android.parent)
185171

186-
override val async = Async(android)
187-
188172
actual fun collection(collectionPath: String) = CollectionReference(android.collection(collectionPath))
189173

190174
actual suspend fun get() =
191175
DocumentSnapshot(android.get().await())
192176

177+
override suspend fun setEncoded(encodedData: Any, setOptions: SetOptions) {
178+
val task = (setOptions.android?.let {
179+
android.set(encodedData, it)
180+
} ?: android.set(encodedData))
181+
task.await()
182+
}
183+
184+
@Suppress("UNCHECKED_CAST")
185+
override suspend fun updateEncoded(encodedData: Any) {
186+
android.update(encodedData as Map<String, Any>).await()
187+
}
188+
189+
override suspend fun updateEncodedFieldsAndValues(encodedFieldsAndValues: List<Pair<String, Any?>>) {
190+
encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }?.let {
191+
android.update(encodedFieldsAndValues.toMap())
192+
}?.await()
193+
}
194+
195+
override suspend fun updateEncodedFieldPathsAndValues(encodedFieldsAndValues: List<Pair<EncodedFieldPath, Any?>>) {
196+
encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }
197+
?.performUpdate { field, value, moreFieldsAndValues ->
198+
android.update(field, value, *moreFieldsAndValues)
199+
}?.await()
200+
}
201+
202+
override suspend fun delete() {
203+
android.delete().await()
204+
}
205+
193206
actual val snapshots: Flow<DocumentSnapshot> get() = snapshots()
194207

195208
actual fun snapshots(includeMetadataChanges: Boolean) = callbackFlow {
@@ -205,29 +218,6 @@ actual class DocumentReference actual constructor(internal actual val nativeValu
205218
this === other || other is DocumentReference && nativeValue == other.nativeValue
206219
override fun hashCode(): Int = nativeValue.hashCode()
207220
override fun toString(): String = nativeValue.toString()
208-
209-
@Suppress("DeferredIsResult")
210-
class Async(@PublishedApi internal val android: NativeDocumentReference) : BaseDocumentReference.Async() {
211-
212-
override fun setEncoded(encodedData: Any, setOptions: SetOptions): Deferred<Unit> = (setOptions.android?.let {
213-
android.set(encodedData, it)
214-
} ?: android.set(encodedData)).asUnitDeferred()
215-
216-
@Suppress("UNCHECKED_CAST")
217-
override fun updateEncoded(encodedData: Any): Deferred<Unit> = android.update(encodedData as Map<String, Any>).asUnitDeferred()
218-
219-
override fun updateEncodedFieldsAndValues(encodedFieldsAndValues: List<Pair<String, Any?>>): Deferred<Unit> = encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }?.let {
220-
android.update(encodedFieldsAndValues.toMap())
221-
}?.asUnitDeferred() ?: CompletableDeferred(Unit)
222-
223-
override fun updateEncodedFieldPathsAndValues(encodedFieldsAndValues: List<Pair<EncodedFieldPath, Any?>>): Deferred<Unit> = encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }
224-
?.performUpdate { field, value, moreFieldsAndValues ->
225-
android.update(field, value, *moreFieldsAndValues)
226-
}?.asUnitDeferred() ?: CompletableDeferred(Unit)
227-
228-
override fun delete() =
229-
android.delete().asUnitDeferred()
230-
}
231221
}
232222

233223
actual typealias NativeQuery = AndroidQuery
@@ -345,7 +335,6 @@ actual class CollectionReference(override val android: com.google.firebase.fires
345335

346336
actual val path: String
347337
get() = android.path
348-
override val async = Async(android)
349338

350339
actual val document: DocumentReference
351340
get() = DocumentReference(android.document())
@@ -355,10 +344,7 @@ actual class CollectionReference(override val android: com.google.firebase.fires
355344

356345
actual fun document(documentPath: String) = DocumentReference(android.document(documentPath))
357346

358-
@Suppress("DeferredIsResult")
359-
class Async(@PublishedApi internal val android: com.google.firebase.firestore.CollectionReference) : BaseCollectionReference.Async() {
360-
override fun addEncoded(data: Any): Deferred<DocumentReference> = android.add(data).asDeferred().convert(::DocumentReference)
361-
}
347+
override suspend fun addEncoded(data: Any) = DocumentReference(android.add(data).await())
362348
}
363349

364350
actual typealias FirebaseFirestoreException = com.google.firebase.firestore.FirebaseFirestoreException

firebase-firestore/src/commonMain/kotlin/dev/gitlive/firebase/firestore/DeferredExtensions.kt

-17
This file was deleted.

0 commit comments

Comments
 (0)