Skip to content

Commit 3fde0f5

Browse files
committed
Improves DSL for updating firestore references
1 parent bf8680c commit 3fde0f5

File tree

21 files changed

+318
-327
lines changed

21 files changed

+318
-327
lines changed

firebase-firestore/api/android/firebase-firestore.api

Lines changed: 23 additions & 44 deletions
Large diffs are not rendered by default.

firebase-firestore/api/jvm/firebase-firestore.api

Lines changed: 23 additions & 44 deletions
Large diffs are not rendered by default.

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package dev.gitlive.firebase.firestore.internal
22

33
import com.google.android.gms.tasks.TaskExecutors
44
import com.google.firebase.firestore.MetadataChanges
5-
import dev.gitlive.firebase.firestore.EncodedFieldPath
65
import dev.gitlive.firebase.firestore.NativeDocumentReferenceType
76
import dev.gitlive.firebase.firestore.NativeDocumentSnapshot
87
import dev.gitlive.firebase.firestore.Source
@@ -44,19 +43,12 @@ internal actual class NativeDocumentReference actual constructor(actual val nati
4443
android.update(encodedData.android).await()
4544
}
4645

47-
actual suspend fun updateEncodedFieldsAndValues(encodedFieldsAndValues: List<Pair<String, Any?>>) {
46+
actual suspend fun updateEncoded(encodedFieldsAndValues: List<FieldAndValue>) {
4847
encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }?.let {
49-
android.update(encodedFieldsAndValues.toMap())
48+
encodedFieldsAndValues.performUpdate(android::update, android::update)
5049
}?.await()
5150
}
5251

53-
actual suspend fun updateEncodedFieldPathsAndValues(encodedFieldsAndValues: List<Pair<EncodedFieldPath, Any?>>) {
54-
encodedFieldsAndValues.takeUnless { encodedFieldsAndValues.isEmpty() }
55-
?.performUpdate { field, value, moreFieldsAndValues ->
56-
android.update(field, value, *moreFieldsAndValues)
57-
}?.await()
58-
}
59-
6052
actual suspend fun delete() {
6153
android.delete().await()
6254
}

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.gitlive.firebase.firestore.internal
22

33
import dev.gitlive.firebase.firestore.DocumentReference
4-
import dev.gitlive.firebase.firestore.EncodedFieldPath
54
import dev.gitlive.firebase.firestore.NativeTransaction
65
import dev.gitlive.firebase.firestore.android
76
import dev.gitlive.firebase.firestore.performUpdate
@@ -23,19 +22,17 @@ internal actual class NativeTransactionWrapper internal actual constructor(actua
2322

2423
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject) = native.update(documentRef.android, encodedData.android).let { this }
2524

26-
actual fun updateEncodedFieldsAndValues(
25+
actual fun updateEncoded(
2726
documentRef: DocumentReference,
28-
encodedFieldsAndValues: List<Pair<String, Any?>>,
29-
) = encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues ->
30-
native.update(documentRef.android, field, value, *moreFieldsAndValues)
31-
}.let { this }
32-
33-
actual fun updateEncodedFieldPathsAndValues(
34-
documentRef: DocumentReference,
35-
encodedFieldsAndValues: List<Pair<EncodedFieldPath, Any?>>,
36-
) = encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues ->
37-
native.update(documentRef.android, field, value, *moreFieldsAndValues)
38-
}.let { this }
27+
encodedFieldsAndValues: List<FieldAndValue>,
28+
) = encodedFieldsAndValues.performUpdate(
29+
updateAsField = { field, value, moreFieldsAndValues ->
30+
native.update(documentRef.android, field, value, *moreFieldsAndValues)
31+
},
32+
updateAsFieldPath = { fieldPath, value, moreFieldsAndValues ->
33+
native.update(documentRef.android, fieldPath, value, *moreFieldsAndValues)
34+
},
35+
).let { this }
3936

4037
actual fun delete(documentRef: DocumentReference) =
4138
native.delete(documentRef.android).let { this }

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

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package dev.gitlive.firebase.firestore.internal
22

33
import dev.gitlive.firebase.firestore.DocumentReference
4-
import dev.gitlive.firebase.firestore.EncodedFieldPath
54
import dev.gitlive.firebase.firestore.NativeWriteBatch
65
import dev.gitlive.firebase.firestore.android
76
import dev.gitlive.firebase.firestore.performUpdate
@@ -25,19 +24,17 @@ internal actual class NativeWriteBatchWrapper internal actual constructor(actual
2524

2625
actual fun updateEncoded(documentRef: DocumentReference, encodedData: EncodedObject) = native.update(documentRef.android, encodedData.android).let { this }
2726

28-
actual fun updateEncodedFieldsAndValues(
27+
actual fun updateEncoded(
2928
documentRef: DocumentReference,
30-
encodedFieldsAndValues: List<Pair<String, Any?>>,
31-
) = encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues ->
32-
native.update(documentRef.android, field, value, *moreFieldsAndValues)
33-
}.let { this }
34-
35-
actual fun updateEncodedFieldPathsAndValues(
36-
documentRef: DocumentReference,
37-
encodedFieldsAndValues: List<Pair<EncodedFieldPath, Any?>>,
38-
) = encodedFieldsAndValues.performUpdate { field, value, moreFieldsAndValues ->
39-
native.update(documentRef.android, field, value, *moreFieldsAndValues)
40-
}.let { this }
29+
encodedFieldsAndValues: List<FieldAndValue>,
30+
) = encodedFieldsAndValues.performUpdate(
31+
updateAsField = { field, value, moreFieldsAndValues ->
32+
native.update(documentRef.android, field, value, *moreFieldsAndValues)
33+
},
34+
updateAsFieldPath = { fieldPath, value, moreFieldsAndValues ->
35+
native.update(documentRef.android, fieldPath, value, *moreFieldsAndValues)
36+
},
37+
).let { this }
4138

4239
actual fun delete(documentRef: DocumentReference) =
4340
native.delete(documentRef.android).let { this }

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

Lines changed: 0 additions & 13 deletions
This file was deleted.
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package dev.gitlive.firebase.firestore
2+
3+
import dev.gitlive.firebase.EncodeSettings
4+
import kotlinx.serialization.SerializationStrategy
5+
6+
public class FieldValueBuilder internal constructor() {
7+
8+
internal val fieldValues: MutableList<Any> = mutableListOf()
9+
public var buildSettings: EncodeSettings.Builder.() -> Unit = {
10+
encodeDefaults = true
11+
}
12+
13+
public inline fun <reified T> add(value: T) {
14+
addEncoded(encode(value, buildSettings)!!)
15+
}
16+
17+
public fun <T : Any> addWithStrategy(strategy: SerializationStrategy<T>, value: T) {
18+
addEncoded(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings)!!)
19+
}
20+
21+
@PublishedApi
22+
internal fun addEncoded(encodedValue: Any) {
23+
fieldValues += encodedValue
24+
}
25+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package dev.gitlive.firebase.firestore
2+
3+
import dev.gitlive.firebase.EncodeSettings
4+
import dev.gitlive.firebase.firestore.internal.FieldAndValue
5+
import kotlinx.serialization.SerializationStrategy
6+
7+
public class FieldsAndValuesBuilder internal constructor() {
8+
9+
internal val fieldAndValues: MutableList<FieldAndValue> = mutableListOf()
10+
public var buildSettings: EncodeSettings.Builder.() -> Unit = {
11+
encodeDefaults = true
12+
}
13+
14+
public inline infix fun <reified T> String.to(value: T) {
15+
toEncoded(encode(value, buildSettings))
16+
}
17+
18+
public inline infix fun <reified T> FieldPath.to(value: T) {
19+
toEncoded(encode(value, buildSettings))
20+
}
21+
22+
public fun <T : Any> String.to(strategy: SerializationStrategy<T>, value: T) {
23+
toEncoded(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
24+
}
25+
26+
public fun <T : Any> FieldPath.to(strategy: SerializationStrategy<T>, value: T) {
27+
toEncoded(dev.gitlive.firebase.internal.encode(strategy, value, buildSettings))
28+
}
29+
30+
@PublishedApi
31+
internal fun String.toEncoded(encodedValue: Any?) {
32+
fieldAndValues += FieldAndValue.WithStringField(this, encodedValue)
33+
}
34+
35+
@PublishedApi
36+
internal fun FieldPath.toEncoded(encodedValue: Any?) {
37+
fieldAndValues += FieldAndValue.WithFieldPath(this, encodedValue)
38+
}
39+
}

0 commit comments

Comments
 (0)