core/features/common/common/src/commonMain/kotlin/dev/inmo/postssystem/features/common/common/SimpleInputProvider.kt

59 lines
1.7 KiB
Kotlin
Raw Normal View History

2022-01-17 08:45:12 +00:00
package dev.inmo.postssystem.features.common.common
2022-03-06 12:06:57 +00:00
import dev.inmo.micro_utils.common.MPPFile
2022-01-17 08:45:12 +00:00
import io.ktor.utils.io.core.*
import kotlinx.serialization.KSerializer
2022-03-06 12:06:57 +00:00
import kotlinx.serialization.builtins.ByteArraySerializer
2022-01-17 08:45:12 +00:00
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
2022-03-06 12:06:57 +00:00
import kotlinx.serialization.Serializable
2022-01-17 08:45:12 +00:00
2022-03-06 12:06:57 +00:00
@Serializable(SimpleInputProviderSerializer::class)
interface SimpleInputProvider {
val contentBytes: Long?
2022-03-06 12:06:57 +00:00
operator fun invoke(): Input
}
@Serializable
class BytesBasedInputProvider(
private val bytes: ByteArray
) : SimpleInputProvider {
override val contentBytes: Long
get() = bytes.size.toLong()
2022-03-06 12:06:57 +00:00
override fun invoke(): Input {
return ByteReadPacket(bytes)
}
}
@Serializable(SimpleInputProviderSerializer::class)
expect class FileBasedInputProvider : SimpleInputProvider {
val file: MPPFile
}
2022-01-17 08:45:12 +00:00
2022-03-06 12:37:24 +00:00
@Serializable(SimpleInputProviderSerializer::class)
class CustomInputProvider(private val provider: () -> Input) : SimpleInputProvider {
2022-03-13 15:58:10 +00:00
override val contentBytes: Long?
get() = null
2022-03-06 12:37:24 +00:00
override fun invoke(): Input = provider()
}
2022-01-17 08:45:12 +00:00
object SimpleInputProviderSerializer : KSerializer<SimpleInputProvider> {
2022-03-06 12:06:57 +00:00
private val serializer = ByteArraySerializer()
2022-01-17 08:45:12 +00:00
override val descriptor: SerialDescriptor
2022-03-06 12:06:57 +00:00
get() = serializer.descriptor
2022-01-17 08:45:12 +00:00
override fun deserialize(decoder: Decoder): SimpleInputProvider {
2022-03-06 12:06:57 +00:00
val bytes = serializer.deserialize(decoder)
return BytesBasedInputProvider(bytes)
2022-01-17 08:45:12 +00:00
}
override fun serialize(encoder: Encoder, value: SimpleInputProvider) {
2022-03-06 12:06:57 +00:00
serializer.serialize(
encoder,
2022-01-17 08:45:12 +00:00
value().readBytes()
2022-03-06 12:06:57 +00:00
)
2022-01-17 08:45:12 +00:00
}
}