Skip to content

Commit 59fb0fd

Browse files
committed
Use different encodeSettings approach
1 parent 545eea2 commit 59fb0fd

File tree

10 files changed

+237
-171
lines changed

10 files changed

+237
-171
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,12 @@ documentRef.updateFields {
196196
// Set the value of otherField to "1" using a custom Serializer
197197
"otherField".to(IntAsStringSerializer(), 1)
198198

199-
// Overwrite build settings. All fields added after this will have these build settings applied
200-
encodeNextWith {
199+
// Overwrite build settings. All fields added within this block will have these build settings applied
200+
withEncodeSettings {
201201
encodeDefaults = true
202202
serializersModule = module
203+
"city" to abstractCity
203204
}
204-
"city" to abstractCity
205205
}
206206
```
207207

@@ -214,12 +214,12 @@ query.orderBy("field", "otherField", "city").startAtFieldValues { // similar syn
214214
// Starts at "1" for the otherField value
215215
add(1, IntAsStringSerializer())
216216

217-
// Overwrite build settings. All field values added after this will have these build settings applied
218-
encodeNextWith {
217+
// Overwrite build settings. All field values added within this block will have these build settings applied
218+
withEncodeSettings {
219219
encodeDefaults = true
220220
serializersModule = module
221+
add(abstractCity)
221222
}
222-
add(abstractCity)
223223
}
224224
```
225225

firebase-common/api/android/firebase-common.api

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ public abstract interface class dev/gitlive/firebase/EncodeDecodeSettings {
1313
public abstract interface class dev/gitlive/firebase/EncodeDecodeSettingsBuilder : dev/gitlive/firebase/DecodeSettings$Builder, dev/gitlive/firebase/EncodeSettings$Builder {
1414
}
1515

16+
public final class dev/gitlive/firebase/EncodeDecodeSettingsKt {
17+
public static final fun copyFrom (Ldev/gitlive/firebase/DecodeSettings$Builder;Ldev/gitlive/firebase/DecodeSettings$Builder;)V
18+
public static final fun copyFrom (Ldev/gitlive/firebase/EncodeSettings$Builder;Ldev/gitlive/firebase/EncodeSettings$Builder;)V
19+
}
20+
1621
public abstract interface class dev/gitlive/firebase/EncodeSettings : dev/gitlive/firebase/EncodeDecodeSettings {
1722
public abstract fun getEncodeDefaults ()Z
1823
}

firebase-common/api/jvm/firebase-common.api

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ public abstract interface class dev/gitlive/firebase/EncodeDecodeSettings {
1313
public abstract interface class dev/gitlive/firebase/EncodeDecodeSettingsBuilder : dev/gitlive/firebase/DecodeSettings$Builder, dev/gitlive/firebase/EncodeSettings$Builder {
1414
}
1515

16+
public final class dev/gitlive/firebase/EncodeDecodeSettingsKt {
17+
public static final fun copyFrom (Ldev/gitlive/firebase/DecodeSettings$Builder;Ldev/gitlive/firebase/DecodeSettings$Builder;)V
18+
public static final fun copyFrom (Ldev/gitlive/firebase/EncodeSettings$Builder;Ldev/gitlive/firebase/EncodeSettings$Builder;)V
19+
}
20+
1621
public abstract interface class dev/gitlive/firebase/EncodeSettings : dev/gitlive/firebase/EncodeDecodeSettings {
1722
public abstract fun getEncodeDefaults ()Z
1823
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public interface EncodeSettings : EncodeDecodeSettings {
2727
}
2828
}
2929

30+
public fun EncodeSettings.Builder.copyFrom(other: EncodeSettings.Builder) {
31+
encodeDefaults = other.encodeDefaults
32+
serializersModule = other.serializersModule
33+
}
34+
3035
/**
3136
* [EncodeDecodeSettings] used when decoding an object
3237
* @param serializersModule the [SerializersModule] to use for deserialization. This allows for polymorphic serialization on runtime
@@ -38,6 +43,10 @@ public interface DecodeSettings : EncodeDecodeSettings {
3843
}
3944
}
4045

46+
public fun DecodeSettings.Builder.copyFrom(other: DecodeSettings.Builder) {
47+
serializersModule = other.serializersModule
48+
}
49+
4150
public interface EncodeDecodeSettingsBuilder :
4251
EncodeSettings.Builder,
4352
DecodeSettings.Builder

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -169,22 +169,27 @@ public final class dev/gitlive/firebase/firestore/FieldValueSerializer : kotlinx
169169
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
170170
}
171171

172-
public final class dev/gitlive/firebase/firestore/FieldValuesDSL {
173-
public final fun addEncoded (Ljava/lang/Object;)V
172+
public final class dev/gitlive/firebase/firestore/FieldValuesDSL : dev/gitlive/firebase/EncodeSettings$Builder {
174173
public final fun addWithStrategy (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
175-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
176-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
177-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
178-
}
179-
180-
public final class dev/gitlive/firebase/firestore/FieldsAndValuesUpdateDSL {
181-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
182-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
183-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
174+
public fun getEncodeDefaults ()Z
175+
public final fun getFieldValuesToAdd ()Ljava/util/List;
176+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
177+
public fun setEncodeDefaults (Z)V
178+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
179+
public final fun withEncodeSettings (Lkotlin/jvm/functions/Function1;)V
180+
}
181+
182+
public final class dev/gitlive/firebase/firestore/FieldsAndValuesUpdateDSL : dev/gitlive/firebase/EncodeSettings$Builder {
183+
public fun getEncodeDefaults ()Z
184+
public final fun getFieldAndValueToAdd ()Ljava/util/List;
185+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
186+
public fun setEncodeDefaults (Z)V
187+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
184188
public final fun to (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
185189
public final fun to (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
186-
public final fun toEncoded (Ldev/gitlive/firebase/firestore/FieldPath;Ljava/lang/Object;)V
187-
public final fun toEncoded (Ljava/lang/String;Ljava/lang/Object;)V
190+
public final fun toEncoded (Ldev/gitlive/firebase/firestore/FieldPath;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/internal/FieldAndValue$WithFieldPath;
191+
public final fun toEncoded (Ljava/lang/String;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/internal/FieldAndValue$WithStringField;
192+
public final fun withEncodeSettings (Lkotlin/jvm/functions/Function1;)V
188193
}
189194

190195
public abstract class dev/gitlive/firebase/firestore/Filter {
@@ -232,18 +237,19 @@ public abstract class dev/gitlive/firebase/firestore/Filter$WithConstraint : dev
232237
public abstract fun getConstraint ()Ldev/gitlive/firebase/firestore/WhereConstraint;
233238
}
234239

235-
public final class dev/gitlive/firebase/firestore/FilterBuilder {
240+
public final class dev/gitlive/firebase/firestore/FilterBuilder : dev/gitlive/firebase/EncodeSettings$Builder {
236241
public final fun all ([Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter;
237242
public final fun and (Ldev/gitlive/firebase/firestore/Filter;Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter$And;
238243
public final fun any ([Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter;
239244
public final fun contains (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
240245
public final fun contains (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
241246
public final fun containsAny (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
242247
public final fun containsAny (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
243-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
244248
public final fun equalTo (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
245249
public final fun equalTo (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
246-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
250+
public fun getEncodeDefaults ()Z
251+
public final fun getEncodeSettingsBuilder ()Lkotlin/jvm/functions/Function1;
252+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
247253
public final fun greaterThan (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
248254
public final fun greaterThan (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
249255
public final fun greaterThanOrEqualTo (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
@@ -263,7 +269,9 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder {
263269
public final fun notInArray (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
264270
public final fun notInArray (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
265271
public final fun or (Ldev/gitlive/firebase/firestore/Filter;Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter$Or;
266-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
272+
public fun setEncodeDefaults (Z)V
273+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
274+
public final fun withEncoder (Lkotlin/jvm/functions/Function1;)Ldev/gitlive/firebase/firestore/Filter;
267275
}
268276

269277
public final class dev/gitlive/firebase/firestore/FirebaseFirestore {

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

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -169,22 +169,27 @@ public final class dev/gitlive/firebase/firestore/FieldValueSerializer : kotlinx
169169
public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
170170
}
171171

172-
public final class dev/gitlive/firebase/firestore/FieldValuesDSL {
173-
public final fun addEncoded (Ljava/lang/Object;)V
172+
public final class dev/gitlive/firebase/firestore/FieldValuesDSL : dev/gitlive/firebase/EncodeSettings$Builder {
174173
public final fun addWithStrategy (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
175-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
176-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
177-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
178-
}
179-
180-
public final class dev/gitlive/firebase/firestore/FieldsAndValuesUpdateDSL {
181-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
182-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
183-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
174+
public fun getEncodeDefaults ()Z
175+
public final fun getFieldValuesToAdd ()Ljava/util/List;
176+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
177+
public fun setEncodeDefaults (Z)V
178+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
179+
public final fun withEncodeSettings (Lkotlin/jvm/functions/Function1;)V
180+
}
181+
182+
public final class dev/gitlive/firebase/firestore/FieldsAndValuesUpdateDSL : dev/gitlive/firebase/EncodeSettings$Builder {
183+
public fun getEncodeDefaults ()Z
184+
public final fun getFieldAndValueToAdd ()Ljava/util/List;
185+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
186+
public fun setEncodeDefaults (Z)V
187+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
184188
public final fun to (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
185189
public final fun to (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
186-
public final fun toEncoded (Ldev/gitlive/firebase/firestore/FieldPath;Ljava/lang/Object;)V
187-
public final fun toEncoded (Ljava/lang/String;Ljava/lang/Object;)V
190+
public final fun toEncoded (Ldev/gitlive/firebase/firestore/FieldPath;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/internal/FieldAndValue$WithFieldPath;
191+
public final fun toEncoded (Ljava/lang/String;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/internal/FieldAndValue$WithStringField;
192+
public final fun withEncodeSettings (Lkotlin/jvm/functions/Function1;)V
188193
}
189194

190195
public abstract class dev/gitlive/firebase/firestore/Filter {
@@ -232,18 +237,19 @@ public abstract class dev/gitlive/firebase/firestore/Filter$WithConstraint : dev
232237
public abstract fun getConstraint ()Ldev/gitlive/firebase/firestore/WhereConstraint;
233238
}
234239

235-
public final class dev/gitlive/firebase/firestore/FilterBuilder {
240+
public final class dev/gitlive/firebase/firestore/FilterBuilder : dev/gitlive/firebase/EncodeSettings$Builder {
236241
public final fun all ([Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter;
237242
public final fun and (Ldev/gitlive/firebase/firestore/Filter;Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter$And;
238243
public final fun any ([Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter;
239244
public final fun contains (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
240245
public final fun contains (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
241246
public final fun containsAny (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
242247
public final fun containsAny (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
243-
public final fun encodeNextWith (Lkotlin/jvm/functions/Function1;)V
244248
public final fun equalTo (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
245249
public final fun equalTo (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
246-
public final fun getEncodeNextWith ()Lkotlin/jvm/functions/Function1;
250+
public fun getEncodeDefaults ()Z
251+
public final fun getEncodeSettingsBuilder ()Lkotlin/jvm/functions/Function1;
252+
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
247253
public final fun greaterThan (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
248254
public final fun greaterThan (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
249255
public final fun greaterThanOrEqualTo (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
@@ -263,7 +269,9 @@ public final class dev/gitlive/firebase/firestore/FilterBuilder {
263269
public final fun notInArray (Ldev/gitlive/firebase/firestore/FieldPath;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
264270
public final fun notInArray (Ljava/lang/String;Lkotlinx/serialization/SerializationStrategy;Ljava/util/List;)Ldev/gitlive/firebase/firestore/Filter$WithConstraint;
265271
public final fun or (Ldev/gitlive/firebase/firestore/Filter;Ldev/gitlive/firebase/firestore/Filter;)Ldev/gitlive/firebase/firestore/Filter$Or;
266-
public final fun setEncodeNextWith (Lkotlin/jvm/functions/Function1;)V
272+
public fun setEncodeDefaults (Z)V
273+
public fun setSerializersModule (Lkotlinx/serialization/modules/SerializersModule;)V
274+
public final fun withEncoder (Lkotlin/jvm/functions/Function1;)Ldev/gitlive/firebase/firestore/Filter;
267275
}
268276

269277
public final class dev/gitlive/firebase/firestore/FirebaseFirestore {
Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,60 @@
11
package dev.gitlive.firebase.firestore
22

33
import dev.gitlive.firebase.EncodeSettings
4+
import dev.gitlive.firebase.copyFrom
45
import kotlinx.serialization.SerializationStrategy
6+
import kotlinx.serialization.modules.EmptySerializersModule
7+
import kotlinx.serialization.modules.SerializersModule
58

69
/**
710
* A builder for generating the field values of a [Query].
811
* The order of the field values must match the order by clauses of the [Query]
912
*/
10-
public class FieldValuesDSL internal constructor() {
13+
public class FieldValuesDSL internal constructor() : EncodeSettings.Builder {
1114

12-
internal val fieldValues: MutableList<Any> = mutableListOf()
15+
override var encodeDefaults: Boolean = true
16+
override var serializersModule: SerializersModule = EmptySerializersModule()
1317

1418
@PublishedApi
15-
internal var encodeNextWith: EncodeSettings.Builder.() -> Unit = {
16-
encodeDefaults = true
17-
}
18-
19-
/**
20-
* Sets the [EncodeSettings.Builder] to apply to the next field values added.
21-
* Updating this value will only influence the encoding of field values not yet added to the update.
22-
* This allows for custom encoding per value, e.g.
23-
*
24-
* ```
25-
* encodeNextWith { encodeDefaults = true }
26-
* add(ClassWithDefaults())
27-
* encodeNextWith { encodeDefaults = false }
28-
* add(ClassWithDefaults())
29-
* ```
30-
*/
31-
public fun encodeNextWith(builder: EncodeSettings.Builder.() -> Unit) {
32-
encodeNextWith = builder
19+
internal val fieldValuesToAdd: MutableList<() -> Any> = mutableListOf()
20+
internal val fieldValues = fieldValuesToAdd.map { valueToEncode ->
21+
valueToEncode.invoke()
3322
}
3423

3524
/**
3625
* Adds a field value to the [Query]
26+
* The [value] will be encoded according to the [EncodeSettings] set by this builder.
3727
* @param T the type of the value to add
3828
* @param value the value [T] to add
3929
*/
4030
public inline fun <reified T> add(value: T) {
41-
addEncoded(encode(value, encodeNextWith)!!)
31+
fieldValuesToAdd.add {
32+
encode(value, { copyFrom(this@FieldValuesDSL) })!!
33+
}
4234
}
4335

4436
/**
4537
* Adds a field value to the [Query]
38+
* The [value] will be encoded according to the [EncodeSettings] set by this builder.
4639
* @param T the type of the value to add
4740
* @param strategy the [SerializationStrategy] to apply to the value
4841
* @param value the value [T] to add
4942
*/
5043
public fun <T : Any> addWithStrategy(strategy: SerializationStrategy<T>, value: T) {
51-
addEncoded(dev.gitlive.firebase.internal.encode(strategy, value, encodeNextWith)!!)
44+
fieldValuesToAdd.add {
45+
dev.gitlive.firebase.internal.encode(strategy, value, { copyFrom(this@FieldValuesDSL) })!!
46+
}
5247
}
5348

54-
@PublishedApi
55-
internal fun addEncoded(encodedValue: Any) {
56-
fieldValues += encodedValue
49+
/**
50+
* Provides an accessor for encoding values with [EncodeSettings]
51+
* @param dls the [FieldValuesDSL] to specify the [EncodeSettings] and values to add
52+
*/
53+
public fun withEncodeSettings(dls: FieldValuesDSL.() -> Unit) {
54+
fieldValuesToAdd.addAll(
55+
FieldValuesDSL()
56+
.apply { copyFrom(this@FieldValuesDSL) }
57+
.apply(dls).fieldValuesToAdd,
58+
)
5759
}
5860
}

0 commit comments

Comments
 (0)