Skip to content

Moves ValueWithSerializer back into public API #605

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

Closed
Closed
Changes from all commits
Commits
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
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
@@ -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;
@@ -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;
@@ -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
@@ -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;
@@ -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;
@@ -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;
}

Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlinx.serialization.encoding.CompositeDecoder

public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
internal actual fun FirebaseDecoderImpl.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
StructureKind.CLASS, StructureKind.OBJECT -> decodeAsMap(false)
StructureKind.LIST -> (value as? List<*>).orEmpty().let {
FirebaseCompositeDecoder(it.size, settings) { _, index -> it[index] }
@@ -26,10 +26,10 @@ public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor,
else -> TODO("The firebase-kotlin-sdk does not support $descriptor for serialization yet")
}

public actual fun getPolymorphicType(value: Any?, discriminator: String): String =
internal actual fun getPolymorphicType(value: Any?, discriminator: String): String =
(value as? Map<*, *>).orEmpty()[discriminator] as String

private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
private fun FirebaseDecoderImpl.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
FirebaseClassDecoder(map.size, settings, { map.containsKey(it) }) { desc, index ->
if (isNestedPolymorphic) {
if (desc.getElementName(index) == "value") {
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlin.collections.set

public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
internal actual fun FirebaseEncoderImpl.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
StructureKind.LIST -> mutableListOf<Any?>()
.also { value = it }
.let { FirebaseCompositeEncoder(settings) { _, index, value -> it.add(index, value) } }
@@ -20,7 +20,7 @@ public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor)
else -> TODO("The firebase-kotlin-sdk does not support $descriptor for serialization yet")
}

private fun FirebaseEncoder.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = mutableMapOf<Any?, Any?>()
private fun FirebaseEncoderImpl.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = mutableMapOf<Any?, Any?>()
.also { value = it }
.let {
FirebaseCompositeEncoder(
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ import kotlinx.serialization.internal.AbstractPolymorphicSerializer
* See https://github.com/Kotlin/kotlinx.serialization/blob/master/formats/json/commonMain/src/kotlinx/serialization/json/internal/Polymorphic.kt
*/
@Suppress("UNCHECKED_CAST")
internal fun <T> FirebaseEncoder.encodePolymorphically(
internal fun <T> FirebaseEncoderImpl.encodePolymorphically(
serializer: SerializationStrategy<T>,
value: T,
ifPolymorphic: (String) -> Unit,
@@ -34,7 +34,7 @@ internal fun <T> FirebaseEncoder.encodePolymorphically(
}

@Suppress("UNCHECKED_CAST")
internal fun <T> FirebaseDecoder.decodeSerializableValuePolymorphic(
internal fun <T> FirebaseDecoderImpl.decodeSerializableValuePolymorphic(
value: Any?,
deserializer: DeserializationStrategy<T>,
): T {
Original file line number Diff line number Diff line change
@@ -5,6 +5,7 @@
package dev.gitlive.firebase.internal

import dev.gitlive.firebase.DecodeSettings
import dev.gitlive.firebase.FirebaseDecoder
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerializationException
@@ -31,12 +32,13 @@ public inline fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?,
@PublishedApi
internal fun <T> decode(strategy: DeserializationStrategy<T>, value: Any?, decodeSettings: DecodeSettings): T {
require(value != null || strategy.descriptor.isNullable) { "Value was null for non-nullable type ${strategy.descriptor.serialName}" }
return FirebaseDecoder(value, decodeSettings).decodeSerializableValue(strategy)
return FirebaseDecoderImpl(value, decodeSettings).decodeSerializableValue(strategy)
}
public expect fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder
public expect fun getPolymorphicType(value: Any?, discriminator: String): String
internal expect fun FirebaseDecoderImpl.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder
internal expect fun getPolymorphicType(value: Any?, discriminator: String): String

public class FirebaseDecoder(public val value: Any?, internal val settings: DecodeSettings) : Decoder {
@PublishedApi
internal class FirebaseDecoderImpl(val value: Any?, internal val settings: DecodeSettings) : FirebaseDecoder {

public constructor(value: Any?) : this(value, DecodeSettingsImpl())

@@ -68,12 +70,12 @@ public class FirebaseDecoder(public val value: Any?, internal val settings: Deco

override fun decodeNull(): Nothing? = decodeNull(value)

override fun decodeInline(descriptor: SerialDescriptor): Decoder = FirebaseDecoder(value, settings)
override fun decodeInline(descriptor: SerialDescriptor): Decoder = FirebaseDecoderImpl(value, settings)

override fun <T> decodeSerializableValue(deserializer: DeserializationStrategy<T>): T = decodeSerializableValuePolymorphic(value, deserializer)
}

public class FirebaseClassDecoder(
internal class FirebaseClassDecoder(
size: Int,
settings: DecodeSettings,
private val containsKey: (name: String) -> Boolean,
@@ -91,7 +93,7 @@ public class FirebaseClassDecoder(
?: DECODE_DONE
}

public open class FirebaseCompositeDecoder(
internal open class FirebaseCompositeDecoder(
private val size: Int,
internal val settings: DecodeSettings,
private val get: (descriptor: SerialDescriptor, index: Int) -> Any?,
@@ -111,7 +113,7 @@ public open class FirebaseCompositeDecoder(
deserializer: DeserializationStrategy<T>,
previousValue: T?,
): T = decodeElement(descriptor, index) {
deserializer.deserialize(FirebaseDecoder(it, settings))
deserializer.deserialize(FirebaseDecoderImpl(it, settings))
}

override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean =
@@ -160,7 +162,7 @@ public open class FirebaseCompositeDecoder(
@ExperimentalSerializationApi
override fun decodeInlineElement(descriptor: SerialDescriptor, index: Int): Decoder =
decodeElement(descriptor, index) {
FirebaseDecoder(it, settings)
FirebaseDecoderImpl(it, settings)
}

private fun <T> decodeElement(descriptor: SerialDescriptor, index: Int, decoder: (Any?) -> T): T = try {
Original file line number Diff line number Diff line change
@@ -5,6 +5,8 @@
package dev.gitlive.firebase.internal

import dev.gitlive.firebase.EncodeSettings
import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.ValueWithSerializer
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.descriptors.SerialDescriptor
@@ -22,7 +24,7 @@ public inline fun <T> encode(strategy: SerializationStrategy<T>, value: T, build

@PublishedApi
internal fun <T> encode(strategy: SerializationStrategy<T>, value: T, encodeSettings: EncodeSettings): Any? =
FirebaseEncoder(encodeSettings).apply { encodeSerializableValue(strategy, value) }.value
FirebaseEncoderImpl(encodeSettings).apply { encodeSerializableValue(strategy, value) }.value

@Deprecated("Deprecated. Use builder instead", replaceWith = ReplaceWith("encode(value) { this.encodeDefaults = shouldEncodeElementDefault }"))
public inline fun <reified T> encode(value: T, shouldEncodeElementDefault: Boolean): Any? = encode(value) {
@@ -60,7 +62,7 @@ public inline fun <reified T : Any> encodeAsObject(value: T, buildSettings: Enco

@PublishedApi
internal inline fun <reified T> encode(value: T, encodeSettings: EncodeSettings): Any? = value?.let {
FirebaseEncoder(encodeSettings).apply {
FirebaseEncoderImpl(encodeSettings).apply {
if (it is ValueWithSerializer<*> && it.value is T) {
@Suppress("UNCHECKED_CAST")
(it as ValueWithSerializer<T>).let {
@@ -72,19 +74,12 @@ internal inline fun <reified T> encode(value: T, encodeSettings: EncodeSettings)
}.value
}

/**
* An extension which which serializer to use for value. Handy in updating fields by name or path
* where using annotation is not possible
* @return a value with a custom serializer.
*/
public fun <T> T.withSerializer(serializer: SerializationStrategy<T>): Any = ValueWithSerializer(this, serializer)
public data class ValueWithSerializer<T>(val value: T, val serializer: SerializationStrategy<T>)
internal expect fun FirebaseEncoderImpl.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder

public expect fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder

public class FirebaseEncoder(
@PublishedApi
internal class FirebaseEncoderImpl(
internal val settings: EncodeSettings,
) : Encoder {
) : FirebaseEncoder {

public constructor(shouldEncodeElementDefault: Boolean) : this(
EncodeSettingsImpl.Builder().apply { this.encodeDefaults = shouldEncodeElementDefault }.buildEncodeSettings(),
@@ -162,7 +157,7 @@ public class FirebaseEncoder(
}
}

public open class FirebaseCompositeEncoder(
internal open class FirebaseCompositeEncoder(
private val settings: EncodeSettings,
private val end: () -> Unit = {},
private val setPolymorphicType: (String, String) -> Unit = { _, _ -> },
@@ -190,7 +185,7 @@ public open class FirebaseCompositeEncoder(
descriptor,
index,
value?.let {
FirebaseEncoder(settings).apply {
FirebaseEncoderImpl(settings).apply {
encodeSerializableValue(serializer, value)
}.value
},
@@ -204,7 +199,7 @@ public open class FirebaseCompositeEncoder(
): Unit = set(
descriptor,
index,
FirebaseEncoder(settings).apply {
FirebaseEncoderImpl(settings).apply {
encodeSerializableValue(serializer, value)
}.value,
)
@@ -231,7 +226,7 @@ public open class FirebaseCompositeEncoder(

@ExperimentalSerializationApi
override fun encodeInlineElement(descriptor: SerialDescriptor, index: Int): Encoder =
FirebaseEncoder(settings)
FirebaseEncoderImpl(settings)

public fun encodePolymorphicClassDiscriminator(discriminator: String, type: String) {
setPolymorphicType(discriminator, type)
Original file line number Diff line number Diff line change
@@ -128,14 +128,14 @@ public class SpecialValueSerializer<T>(
override val descriptor: SerialDescriptor = buildClassSerialDescriptor(serialName) { }

override fun serialize(encoder: Encoder, value: T) {
if (encoder is FirebaseEncoder) {
if (encoder is FirebaseEncoderImpl) {
encoder.value = toNativeValue(value)
} else {
throw SerializationException("This serializer must be used with FirebaseEncoder")
}
}

override fun deserialize(decoder: Decoder): T = if (decoder is FirebaseDecoder) {
override fun deserialize(decoder: Decoder): T = if (decoder is FirebaseDecoderImpl) {
fromNativeValue(decoder.value)
} else {
throw SerializationException("This serializer must be used with FirebaseDecoder")
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.PolymorphicKind
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind

public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
internal actual fun FirebaseDecoderImpl.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
StructureKind.CLASS, StructureKind.OBJECT -> decodeAsMap(false)
StructureKind.LIST -> decodeAsList()
StructureKind.MAP -> (value as? Map<*, *>).orEmpty().entries.toList().let {
@@ -19,13 +19,13 @@ public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor,
else -> TODO("The firebase-kotlin-sdk does not support $descriptor for serialization yet")
}

public actual fun getPolymorphicType(value: Any?, discriminator: String): String =
internal actual fun getPolymorphicType(value: Any?, discriminator: String): String =
(value as? Map<*, *>).orEmpty()[discriminator] as String

private fun FirebaseDecoder.decodeAsList(): CompositeDecoder = (value as? List<*>).orEmpty().let {
private fun FirebaseDecoderImpl.decodeAsList(): CompositeDecoder = (value as? List<*>).orEmpty().let {
FirebaseCompositeDecoder(it.size, settings) { _, index -> it[index] }
}
private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
private fun FirebaseDecoderImpl.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as? Map<*, *>).orEmpty().let { map ->
FirebaseClassDecoder(map.size, settings, { map.containsKey(it) }) { desc, index ->
if (isNestedPolymorphic) {
if (desc.getElementName(index) == "value") {
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlin.collections.set

public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
internal actual fun FirebaseEncoderImpl.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
StructureKind.LIST -> encodeAsList()
StructureKind.MAP -> mutableListOf<Any?>()
.let { FirebaseCompositeEncoder(settings, { value = it.chunked(2).associate { (k, v) -> k to v } }) { _, _, value -> it.add(value) } }
@@ -18,10 +18,10 @@ public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor)
else -> TODO("The firebase-kotlin-sdk does not support $descriptor for serialization yet")
}

private fun FirebaseEncoder.encodeAsList(): FirebaseCompositeEncoder = mutableListOf<Any?>()
private fun FirebaseEncoderImpl.encodeAsList(): FirebaseCompositeEncoder = mutableListOf<Any?>()
.also { value = it }
.let { FirebaseCompositeEncoder(settings) { _, index, value -> it.add(index, value) } }
private fun FirebaseEncoder.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = mutableMapOf<Any?, Any?>()
private fun FirebaseEncoderImpl.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = mutableMapOf<Any?, Any?>()
.also { value = it }
.let {
FirebaseCompositeEncoder(
Original file line number Diff line number Diff line change
@@ -11,7 +11,7 @@ import kotlinx.serialization.descriptors.StructureKind
import kotlinx.serialization.encoding.CompositeDecoder
import kotlin.js.Json

public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
internal actual fun FirebaseDecoderImpl.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) {
StructureKind.CLASS, StructureKind.OBJECT -> decodeAsMap(false)
StructureKind.LIST -> decodeAsList()
StructureKind.MAP -> (js("Object").entries(value) as Array<Array<Any>>).let {
@@ -39,15 +39,15 @@ public actual fun FirebaseDecoder.structureDecoder(descriptor: SerialDescriptor,
}

@Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE")
public actual fun getPolymorphicType(value: Any?, discriminator: String): String =
internal actual fun getPolymorphicType(value: Any?, discriminator: String): String =
(value as Json)[discriminator] as String

private fun FirebaseDecoder.decodeAsList(): CompositeDecoder = (value as Array<*>).let {
private fun FirebaseDecoderImpl.decodeAsList(): CompositeDecoder = (value as Array<*>).let {
FirebaseCompositeDecoder(it.size, settings) { _, index -> it[index] }
}

@Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE")
private fun FirebaseDecoder.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as Json).let { json ->
private fun FirebaseDecoderImpl.decodeAsMap(isNestedPolymorphic: Boolean): CompositeDecoder = (value as Json).let { json ->
FirebaseClassDecoder(js("Object").keys(value).length as Int, settings, { json[it] != undefined }) { desc, index ->
if (isNestedPolymorphic) {
if (desc.getElementName(index) == "value") {
Original file line number Diff line number Diff line change
@@ -9,7 +9,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.descriptors.StructureKind
import kotlin.js.json

public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
internal actual fun FirebaseEncoderImpl.structureEncoder(descriptor: SerialDescriptor): FirebaseCompositeEncoder = when (descriptor.kind) {
StructureKind.LIST -> encodeAsList(descriptor)
StructureKind.MAP -> {
val map = json()
@@ -28,10 +28,10 @@ public actual fun FirebaseEncoder.structureEncoder(descriptor: SerialDescriptor)
else -> TODO("The firebase-kotlin-sdk does not support $descriptor for serialization yet")
}

private fun FirebaseEncoder.encodeAsList(descriptor: SerialDescriptor): FirebaseCompositeEncoder = Array<Any?>(descriptor.elementsCount) { null }
private fun FirebaseEncoderImpl.encodeAsList(descriptor: SerialDescriptor): FirebaseCompositeEncoder = Array<Any?>(descriptor.elementsCount) { null }
.also { value = it }
.let { FirebaseCompositeEncoder(settings) { _, index, value -> it[index] = value } }
private fun FirebaseEncoder.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = json()
private fun FirebaseEncoderImpl.encodeAsMap(descriptor: SerialDescriptor): FirebaseCompositeEncoder = json()
.also { value = it }
.let {
FirebaseCompositeEncoder(
35 changes: 35 additions & 0 deletions firebase-common/api/android/firebase-common.api
Original file line number Diff line number Diff line change
@@ -33,3 +33,38 @@ public synthetic class dev/gitlive/firebase/FirebaseClassDiscriminator$Impl : de
public final synthetic fun discriminator ()Ljava/lang/String;
}

public abstract interface class dev/gitlive/firebase/FirebaseDecoder : kotlinx/serialization/encoding/Decoder {
}

public final class dev/gitlive/firebase/FirebaseDecoder$DefaultImpls {
public static fun decodeNullableSerializableValue (Ldev/gitlive/firebase/FirebaseDecoder;Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object;
public static fun decodeSerializableValue (Ldev/gitlive/firebase/FirebaseDecoder;Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object;
}

public abstract interface class dev/gitlive/firebase/FirebaseEncoder : kotlinx/serialization/encoding/Encoder {
}

public final class dev/gitlive/firebase/FirebaseEncoder$DefaultImpls {
public static fun beginCollection (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
public static fun encodeNotNullMark (Ldev/gitlive/firebase/FirebaseEncoder;)V
public static fun encodeNullableSerializableValue (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public static fun encodeSerializableValue (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
}

public final class dev/gitlive/firebase/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/ValueWithSerializer;
public static synthetic fun copy$default (Ldev/gitlive/firebase/ValueWithSerializer;Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;ILjava/lang/Object;)Ldev/gitlive/firebase/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/ValueWithSerializerKt {
public static final fun withSerializer (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ljava/lang/Object;
}

35 changes: 35 additions & 0 deletions firebase-common/api/jvm/firebase-common.api
Original file line number Diff line number Diff line change
@@ -33,3 +33,38 @@ public synthetic class dev/gitlive/firebase/FirebaseClassDiscriminator$Impl : de
public final synthetic fun discriminator ()Ljava/lang/String;
}

public abstract interface class dev/gitlive/firebase/FirebaseDecoder : kotlinx/serialization/encoding/Decoder {
}

public final class dev/gitlive/firebase/FirebaseDecoder$DefaultImpls {
public static fun decodeNullableSerializableValue (Ldev/gitlive/firebase/FirebaseDecoder;Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object;
public static fun decodeSerializableValue (Ldev/gitlive/firebase/FirebaseDecoder;Lkotlinx/serialization/DeserializationStrategy;)Ljava/lang/Object;
}

public abstract interface class dev/gitlive/firebase/FirebaseEncoder : kotlinx/serialization/encoding/Encoder {
}

public final class dev/gitlive/firebase/FirebaseEncoder$DefaultImpls {
public static fun beginCollection (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/descriptors/SerialDescriptor;I)Lkotlinx/serialization/encoding/CompositeEncoder;
public static fun encodeNotNullMark (Ldev/gitlive/firebase/FirebaseEncoder;)V
public static fun encodeNullableSerializableValue (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
public static fun encodeSerializableValue (Ldev/gitlive/firebase/FirebaseEncoder;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)V
}

public final class dev/gitlive/firebase/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/ValueWithSerializer;
public static synthetic fun copy$default (Ldev/gitlive/firebase/ValueWithSerializer;Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;ILjava/lang/Object;)Ldev/gitlive/firebase/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/ValueWithSerializerKt {
public static final fun withSerializer (Ljava/lang/Object;Lkotlinx/serialization/SerializationStrategy;)Ljava/lang/Object;
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package dev.gitlive.firebase

import kotlinx.serialization.encoding.Decoder

public interface FirebaseDecoder : Decoder
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package dev.gitlive.firebase

import kotlinx.serialization.encoding.Encoder

public interface FirebaseEncoder : Encoder
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package dev.gitlive.firebase

import kotlinx.serialization.SerializationStrategy

/**
* An extension which which serializer to use for value. Handy in updating fields by name or path
* where using annotation is not possible
* @return a value with a custom serializer.
*/
public fun <T> T.withSerializer(serializer: SerializationStrategy<T>): Any = ValueWithSerializer(this, serializer)
public data class ValueWithSerializer<T>(val value: T, val serializer: SerializationStrategy<T>)
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.gitlive.firebase.database

import dev.gitlive.firebase.internal.FirebaseDecoder
import dev.gitlive.firebase.internal.FirebaseEncoder
import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.FirebaseDecoder
import dev.gitlive.firebase.internal.SpecialValueSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.gitlive.firebase.firestore

import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.firestore.internal.NativeDocumentReference
import dev.gitlive.firebase.internal.FirebaseEncoder
import dev.gitlive.firebase.internal.SpecialValueSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerializationException
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package dev.gitlive.firebase.firestore

import dev.gitlive.firebase.internal.FirebaseEncoder
import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.internal.SpecialValueSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerializationException
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package dev.gitlive.firebase.firestore

import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.internal.SpecialValueSerializer
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerializationException
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package dev.gitlive.firebase.firestore

import dev.gitlive.firebase.FirebaseEncoder
import dev.gitlive.firebase.FirebaseDecoder
import dev.gitlive.firebase.internal.SpecialValueSerializer
import dev.gitlive.firebase.firestore.DoubleAsTimestampSerializer.SERVER_TIMESTAMP
import kotlinx.serialization.KSerializer
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ import dev.gitlive.firebase.internal.decode
import dev.gitlive.firebase.initialize
import dev.gitlive.firebase.runBlockingTest
import dev.gitlive.firebase.runTest
import dev.gitlive.firebase.internal.withSerializer
import dev.gitlive.firebase.withSerializer
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay