add default input providers

This commit is contained in:
2022-03-06 18:06:57 +06:00
parent 91927d3b50
commit f5b71dcb84
11 changed files with 78 additions and 34 deletions

View File

@@ -12,9 +12,9 @@ kotlin {
dependencies {
api libs.microutils.common
api libs.microutils.serialization.typedserializer
api libs.klock
api "io.insert-koin:koin-core:$koin_version"
api "com.benasher44:uuid:$uuid_version"
api "com.soywiz.korlibs.klock:klock:$klock_version"
api "io.ktor:ktor-http:$ktor_version"
}
}

View File

@@ -1,30 +1,47 @@
package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.ByteArrayAllocatorSerializer
import dev.inmo.micro_utils.common.MPPFile
import io.ktor.utils.io.core.*
import kotlinx.serialization.KSerializer
import kotlinx.serialization.builtins.ByteArraySerializer
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.Serializable
typealias SimpleInputProvider = () -> Input
@Serializable(SimpleInputProviderSerializer::class)
interface SimpleInputProvider {
operator fun invoke(): Input
}
@Serializable
class BytesBasedInputProvider(
private val bytes: ByteArray
) : SimpleInputProvider {
override fun invoke(): Input {
return ByteReadPacket(bytes)
}
}
@Serializable(SimpleInputProviderSerializer::class)
expect class FileBasedInputProvider : SimpleInputProvider {
val file: MPPFile
}
object SimpleInputProviderSerializer : KSerializer<SimpleInputProvider> {
private val serializer = ByteArraySerializer()
override val descriptor: SerialDescriptor
get() = ByteArrayAllocatorSerializer.descriptor
get() = serializer.descriptor
override fun deserialize(decoder: Decoder): SimpleInputProvider {
val allocator = ByteArrayAllocatorSerializer.deserialize(decoder)
return {
ByteReadPacket(allocator.invoke())
}
val bytes = serializer.deserialize(decoder)
return BytesBasedInputProvider(bytes)
}
override fun serialize(encoder: Encoder, value: SimpleInputProvider) {
ByteArrayAllocatorSerializer.serialize(
encoder
) {
serializer.serialize(
encoder,
value().readBytes()
}
)
}
}

View File

@@ -0,0 +1,14 @@
package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.MPPFile
import io.ktor.utils.io.core.ByteReadPacket
import io.ktor.utils.io.core.Input
import kotlinx.serialization.Serializable
@Serializable(SimpleInputProviderSerializer::class)
actual class FileBasedInputProvider internal constructor(
actual val file: MPPFile,
private val bytes: ByteArray
) : SimpleInputProvider {
override fun invoke(): Input = ByteReadPacket(bytes)
}

View File

@@ -0,0 +1,13 @@
package dev.inmo.postssystem.features.common.common
import dev.inmo.micro_utils.common.MPPFile
import io.ktor.utils.io.core.Input
import io.ktor.utils.io.streams.asInput
import kotlinx.serialization.Serializable
@Serializable(SimpleInputProviderSerializer::class)
actual class FileBasedInputProvider(
actual val file: MPPFile
) : SimpleInputProvider {
override fun invoke(): Input = file.inputStream().asInput()
}

View File

@@ -3,6 +3,7 @@ package dev.inmo.postssystem.features.files.common
import dev.inmo.postssystem.features.files.common.storage.ReadFilesStorage
import dev.inmo.micro_utils.pagination.*
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
import dev.inmo.postssystem.features.common.common.FileBasedInputProvider
import io.ktor.utils.io.streams.asInput
import java.io.File
@@ -37,10 +38,9 @@ class DiskReadFilesStorage(
id,
FullFileInfo(
it.fileInfo.name,
it.fileInfo.mimeType
) {
id.file.inputStream().asInput()
}
it.fileInfo.mimeType,
FileBasedInputProvider(id.file)
)
)
}