Skip to content

Commit

Permalink
feat: add FIXME in InlineEncoder
Browse files Browse the repository at this point in the history
  • Loading branch information
EdmonDantes committed Jul 26, 2023
1 parent 3aae262 commit 0931531
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,61 +17,45 @@ package io.github.edmondantes.serialization.encoding.inline
import io.github.edmondantes.serialization.annotation.InlineSerialization
import io.github.edmondantes.serialization.encoding.CustomSerializationStrategy
import io.github.edmondantes.serialization.getElementAllAnnotation
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.SerializationStrategy
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.CompositeEncoder

//FIXME: rewrite
public class InlineCompositeEncoder(
private val delegate: CompositeEncoder,
private val inlineEncoder: InlineEncoder,
private val endStructureHandler: () -> Boolean,
) : CompositeEncoder by delegate {

@ExperimentalSerializationApi
override fun <T : Any> encodeNullableSerializableElement(
descriptor: SerialDescriptor,
index: Int,
serializer: SerializationStrategy<T>,
value: T?,
) {
inlineDelegate(descriptor, index, serializer, value, delegate::encodeNullableSerializableElement)
}

@Suppress("UNCHECKED_CAST")
override fun <T : Any?> encodeSerializableElement(
descriptor: SerialDescriptor,
index: Int,
serializer: SerializationStrategy<T>,
value: T,
) {
inlineDelegate(descriptor, index, serializer, value) { _, _, inlineSerializer, _ ->
delegate.encodeSerializableElement(descriptor, index, inlineSerializer as SerializationStrategy<T>, value)
}
}
val isInline = descriptor.getElementAllAnnotation(index).filterIsInstance<InlineSerialization>().isNotEmpty()

override fun endStructure(descriptor: SerialDescriptor) {
if (endStructureHandler()) {
delegate.endStructure(descriptor)
if (isInline) {
serializer.serialize(inlineEncoder, value)
return
}
}

private inline fun <T : Any?> inlineDelegate(
descriptor: SerialDescriptor,
index: Int,
serializer: SerializationStrategy<T>,
value: T?,
delegate: (SerialDescriptor, Int, SerializationStrategy<T>, T?) -> Unit,
) {
val isInline = descriptor.getElementAllAnnotation(index).filterIsInstance<InlineSerialization>().isNotEmpty()
val inlineEncodingStrategy = CustomSerializationStrategy(serializer) {
inlineEncoder.changeEncoder(it, isInline)
}

delegate(
delegate.encodeSerializableElement(
descriptor,
index,
CustomSerializationStrategy(serializer) {
inlineEncoder.changeEncoder(it, isInline)
},
inlineEncodingStrategy,
value,
)
}

override fun endStructure(descriptor: SerialDescriptor) {
if (endStructureHandler()) {
delegate.endStructure(descriptor)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.CompositeEncoder
import kotlinx.serialization.encoding.Encoder

//FIXME: rewrite
public class InlineEncoder(
private val delegate: Encoder,
private val compositeEncoderQueue: ArrayDeque<CompositeEncoder> = ArrayDeque(),
Expand Down

0 comments on commit 0931531

Please sign in to comment.