Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Firestore customizable encoding for where clauses and update methods #607

Open
wants to merge 29 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
6251476
Moves ValueWithSerializer back into public API
Daeda88 Aug 29, 2024
6378db9
Merge branch 'master' into feature/public-ValueWithSerializer
nbransby Aug 29, 2024
1c28ed3
Adding support for encoded queries
Daeda88 Aug 30, 2024
f682e3e
Merge remote-tracking branch 'origin/feature/public-ValueWithSerializ…
Daeda88 Aug 30, 2024
bf8680c
Add support for customizing encoding behaviour when updating Values a…
Daeda88 Aug 30, 2024
3fde0f5
Improves DSL for updating firestore references
Daeda88 Sep 1, 2024
dd19681
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Sep 1, 2024
6e0a4de
Slight api format change for readability
Daeda88 Sep 2, 2024
c612f9c
Fixed some bugs and adding tests
Daeda88 Sep 2, 2024
90f870c
Added several tests to stabilize tests
Daeda88 Sep 2, 2024
431bdb8
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Sep 2, 2024
1877b02
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Sep 3, 2024
ebe3198
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Sep 3, 2024
5332e61
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Sep 4, 2024
4176fe6
Make builders abstract to allow for testing
Daeda88 Sep 13, 2024
a138c10
Revert "Make builders abstract to allow for testing"
Daeda88 Sep 13, 2024
a8904da
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Oct 7, 2024
99806bb
PR remarks
Daeda88 Oct 7, 2024
012f958
Fixed broken test
Daeda88 Oct 8, 2024
818fe38
Disable QueryTest for android unit tests
Daeda88 Oct 8, 2024
0da0fd6
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Oct 21, 2024
6d72b0d
Expanded documentation
Daeda88 Oct 21, 2024
ee34197
Refactored buildSettings variable to encodeNextWith cli
Daeda88 Oct 30, 2024
545eea2
Merge remote-tracking branch 'GitLiveApp/master' into feature/field-v…
Daeda88 Nov 13, 2024
59fb0fd
Use different encodeSettings approach
Daeda88 Nov 13, 2024
3a28cbe
Fixed actually getting values
Daeda88 Nov 14, 2024
cfb885b
Lint fix
Daeda88 Nov 15, 2024
2262309
Corrected Filter implementation
Daeda88 Nov 17, 2024
aceb6c1
Small bugfix on Filter
Daeda88 Nov 17, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 39 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Asynchronous operations that return a single or no value are represented by susp
suspend fun signInWithCustomToken(token: String): AuthResult
```

It is important to remember that unlike a callback based API, wating for suspending functions to complete is implicit and so if you don't want to wait for the result you can `launch` a new coroutine:
It is important to remember that unlike a callback based API, waiting for suspending functions to complete is implicit and so if you don't want to wait for the result you can `launch` a new coroutine:

```kotlin
//TODO don't use GlobalScope
Expand Down Expand Up @@ -185,6 +185,44 @@ In combination with a `SerialName` specified for the child class, you have full
}
```

<h4>Serialization of Updates</h4>
Firestore contains update methods that allow for multiple fields to be updated at the same time.
This sdk offers special update methods that allow for applying custom serialization to each individual field though an update builder.
Where an `update` method exists, an `updateFields` method will also be available. In this, each value can have its serializer customized:

```kotlin
documentRef.updateFields {
"field" to "value"
// Set the value of otherField to "1" using a custom Serializer
"otherField".to(IntAsStringSerializer(), 1)

// Overwrite build settings. All fields added within this block will have these build settings applied
withEncodeSettings {
encodeDefaults = true
serializersModule = module
"city" to abstractCity
}
}
```

Similarly, the `Query` methods `startAt`/`startAfter`/`endAt`/`endBefore` have an alternative method in `startAtFieldValues`/`startAfterFieldValues`/`endAtFieldValues`/`endBeforeFieldValues`

```kotlin
query.orderBy("field", "otherField", "city").startAtFieldValues { // similar syntax for startAfter/endAt/endBefore
add("Value")

// Starts at "1" for the otherField value
add(1, IntAsStringSerializer())

// Overwrite build settings. All field values added within this block will have these build settings applied
withEncodeSettings {
encodeDefaults = true
serializersModule = module
add(abstractCity)
}
}
```

<h3><a href="https://kotlinlang.org/docs/reference/functions.html#default-arguments">Default arguments</a></h3>

To reduce boilerplate, default arguments are used in the places where the Firebase Android SDK employs the builder pattern:
Expand All @@ -209,8 +247,6 @@ user.updateProfile(profileUpdates)
user.updateProfile(displayName = "Jane Q. User", photoURL = "https://example.com/jane-q-user/profile.jpg")
```



<h3><a href="https://kotlinlang.org/docs/functions.html#infix-notation">Infix notation</a></h3>

To improve readability and reduce boilerplate for functions such as the Cloud Firestore query operators are built with infix notation:
Expand Down
76 changes: 2 additions & 74 deletions firebase-common-internal/api/android/firebase-common-internal.api
Original file line number Diff line number Diff line change
Expand Up @@ -78,59 +78,9 @@ public final class dev/gitlive/firebase/internal/EncodersKt {
public static final fun encode (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Z)Ljava/lang/Object;
public static final fun encodeAsObject (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ldev/gitlive/firebase/internal/EncodedObject;
public static synthetic fun encodeAsObject$default (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/EncodedObject;
public static final fun withSerializer (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ljava/lang/Object;
}

public final class dev/gitlive/firebase/internal/FirebaseClassDecoder : dev/gitlive/firebase/internal/FirebaseCompositeDecoder {
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeSequentially ()Z
}

public class dev/gitlive/firebase/internal/FirebaseCompositeDecoder : kotlinx/serialization/encoding/CompositeDecoder {
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function2;)V
public fun decodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
public fun decodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)B
public fun decodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)C
public fun decodeCollectionSize (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)D
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)F
public fun decodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Decoder;
public fun decodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)I
public fun decodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)J
public fun decodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
public fun decodeSequentially ()Z
public fun decodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
public fun decodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)S
public fun decodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
}

public class dev/gitlive/firebase/internal/FirebaseCompositeEncoder : kotlinx/serialization/encoding/CompositeEncoder {
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
public synthetic fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun encodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IZ)V
public fun encodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IB)V
public fun encodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IC)V
public fun encodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ID)V
public fun encodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IF)V
public fun encodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Encoder;
public fun encodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;II)V
public fun encodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IJ)V
public fun encodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public final fun encodeObject (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/Object;)V
public final fun encodePolymorphicClassDiscriminator (Ljava/lang/String;Ljava/lang/String;)V
public fun encodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public fun encodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IS)V
public fun encodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
public fun shouldEncodeElementDefault (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
}

public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/serialization/encoding/Decoder {
public final class dev/gitlive/firebase/internal/FirebaseDecoderImpl : dev/gitlive/firebase/FirebaseDecoder {
public fun <init> (Ljava/lang/Object;)V
public fun <init> (Ljava/lang/Object;Ldev/gitlive/firebase/DecodeSettings;)V
public fun beginStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;
Expand All @@ -153,7 +103,7 @@ public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/seria
public final fun getValue ()Ljava/lang/Object;
}

public final class dev/gitlive/firebase/internal/FirebaseEncoder : kotlinx/serialization/encoding/Encoder {
public final class dev/gitlive/firebase/internal/FirebaseEncoderImpl : dev/gitlive/firebase/FirebaseEncoder {
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;)V
public fun <init> (Z)V
public fun beginCollection (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
Expand Down Expand Up @@ -217,25 +167,3 @@ public final class dev/gitlive/firebase/internal/SpecialValueSerializer : kotlin
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
}

public final class dev/gitlive/firebase/internal/ValueWithSerializer {
public fun <init> (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)V
public final fun component1 ()Ljava/lang/Object;
public final fun component2 ()Lkotlinx/serialization/SerializationStrategy;
public final fun copy (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
public static synthetic fun copy$default (Ldev/gitlive/firebase/internal/ValueWithSerializer;Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
public fun equals (Ljava/lang/Object;)Z
public final fun getSerializer ()Lkotlinx/serialization/SerializationStrategy;
public final fun getValue ()Ljava/lang/Object;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class dev/gitlive/firebase/internal/_decodersKt {
public static final fun getPolymorphicType (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
public static final fun structureDecoder (Ldev/gitlive/firebase/internal/FirebaseDecoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Z)Lkotlinx/serialization/encoding/CompositeDecoder;
}

public final class dev/gitlive/firebase/internal/_encodersKt {
public static final fun structureEncoder (Ldev/gitlive/firebase/internal/FirebaseEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)Ldev/gitlive/firebase/internal/FirebaseCompositeEncoder;
}

76 changes: 2 additions & 74 deletions firebase-common-internal/api/jvm/firebase-common-internal.api
Original file line number Diff line number Diff line change
Expand Up @@ -78,59 +78,9 @@ public final class dev/gitlive/firebase/internal/EncodersKt {
public static final fun encode (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Z)Ljava/lang/Object;
public static final fun encodeAsObject (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Ldev/gitlive/firebase/internal/EncodedObject;
public static synthetic fun encodeAsObject$default (Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/EncodedObject;
public static final fun withSerializer (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ljava/lang/Object;
}

public final class dev/gitlive/firebase/internal/FirebaseClassDecoder : dev/gitlive/firebase/internal/FirebaseCompositeDecoder {
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeSequentially ()Z
}

public class dev/gitlive/firebase/internal/FirebaseCompositeDecoder : kotlinx/serialization/encoding/CompositeDecoder {
public fun <init> (ILdev/gitlive/firebase/DecodeSettings;Lkotlin/jvm/functions/Function2;)V
public fun decodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
public fun decodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)B
public fun decodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)C
public fun decodeCollectionSize (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)D
public fun decodeElementIndex (Lkotlinx/serialization/descriptors/SerialDescriptor;)I
public fun decodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)F
public fun decodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Decoder;
public fun decodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)I
public fun decodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)J
public fun decodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
public fun decodeSequentially ()Z
public fun decodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/DeserializationStrategy;Ljava/lang/Object;)Ljava/lang/Object;
public fun decodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)S
public fun decodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Ljava/lang/String;
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
}

public class dev/gitlive/firebase/internal/FirebaseCompositeEncoder : kotlinx/serialization/encoding/CompositeEncoder {
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V
public synthetic fun <init> (Ldev/gitlive/firebase/EncodeSettings;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public fun encodeBooleanElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IZ)V
public fun encodeByteElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IB)V
public fun encodeCharElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IC)V
public fun encodeDoubleElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ID)V
public fun encodeFloatElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IF)V
public fun encodeInlineElement (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/Encoder;
public fun encodeIntElement (Lkotlinx/serialization/descriptors/SerialDescriptor;II)V
public fun encodeLongElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IJ)V
public fun encodeNullableSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public final fun encodeObject (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/Object;)V
public final fun encodePolymorphicClassDiscriminator (Ljava/lang/String;Ljava/lang/String;)V
public fun encodeSerializableElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public fun encodeShortElement (Lkotlinx/serialization/descriptors/SerialDescriptor;IS)V
public fun encodeStringElement (Lkotlinx/serialization/descriptors/SerialDescriptor;ILjava/lang/String;)V
public fun endStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)V
public fun getSerializersModule ()Lkotlinx/serialization/modules/SerializersModule;
public fun shouldEncodeElementDefault (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Z
}

public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/serialization/encoding/Decoder {
public final class dev/gitlive/firebase/internal/FirebaseDecoderImpl : dev/gitlive/firebase/FirebaseDecoder {
public fun <init> (Ljava/lang/Object;)V
public fun <init> (Ljava/lang/Object;Ldev/gitlive/firebase/DecodeSettings;)V
public fun beginStructure (Lkotlinx/serialization/descriptors/SerialDescriptor;)Lkotlinx/serialization/encoding/CompositeDecoder;
Expand All @@ -153,7 +103,7 @@ public final class dev/gitlive/firebase/internal/FirebaseDecoder : kotlinx/seria
public final fun getValue ()Ljava/lang/Object;
}

public final class dev/gitlive/firebase/internal/FirebaseEncoder : kotlinx/serialization/encoding/Encoder {
public final class dev/gitlive/firebase/internal/FirebaseEncoderImpl : dev/gitlive/firebase/FirebaseEncoder {
public fun <init> (Ldev/gitlive/firebase/EncodeSettings;)V
public fun <init> (Z)V
public fun beginCollection (Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
Expand Down Expand Up @@ -217,25 +167,3 @@ public final class dev/gitlive/firebase/internal/SpecialValueSerializer : kotlin
public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V
}

public final class dev/gitlive/firebase/internal/ValueWithSerializer {
public fun <init> (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)V
public final fun component1 ()Ljava/lang/Object;
public final fun component2 ()Lkotlinx/serialization/SerializationStrategy;
public final fun copy (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
public static synthetic fun copy$default (Ldev/gitlive/firebase/internal/ValueWithSerializer;Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;ILjava/lang/Object;)Ldev/gitlive/firebase/internal/ValueWithSerializer;
public fun equals (Ljava/lang/Object;)Z
public final fun getSerializer ()Lkotlinx/serialization/SerializationStrategy;
public final fun getValue ()Ljava/lang/Object;
public fun hashCode ()I
public fun toString ()Ljava/lang/String;
}

public final class dev/gitlive/firebase/internal/_decodersKt {
public static final fun getPolymorphicType (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String;
public static final fun structureDecoder (Ldev/gitlive/firebase/internal/FirebaseDecoder;Lkotlinx/serialization/descriptors/SerialDescriptor;Z)Lkotlinx/serialization/encoding/CompositeDecoder;
}

public final class dev/gitlive/firebase/internal/_encodersKt {
public static final fun structureEncoder (Ldev/gitlive/firebase/internal/FirebaseEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;)Ldev/gitlive/firebase/internal/FirebaseCompositeEncoder;
}

Loading
Loading