MicroUtils/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/ktor/server/ServerRoutingShortcuts.kt

70 lines
1.9 KiB
Kotlin
Raw Normal View History

2020-09-22 02:20:22 +00:00
package dev.inmo.micro_utils.ktor.server
2020-09-26 15:42:05 +00:00
import dev.inmo.micro_utils.coroutines.safely
import dev.inmo.micro_utils.ktor.common.*
2020-09-22 02:20:22 +00:00
import io.ktor.application.ApplicationCall
import io.ktor.http.HttpStatusCode
2020-09-26 15:42:05 +00:00
import io.ktor.request.receive
2020-09-22 02:20:22 +00:00
import io.ktor.response.respond
import io.ktor.response.respondBytes
2020-11-02 15:34:49 +00:00
import kotlinx.serialization.DeserializationStrategy
import kotlinx.serialization.SerializationStrategy
2020-09-22 02:20:22 +00:00
suspend fun <T> ApplicationCall.unianswer(
answerSerializer: SerializationStrategy<T>,
answer: T
) {
2020-09-26 15:42:05 +00:00
respondBytes (
standardKtorSerialFormat.encodeDefault(answerSerializer, answer),
2020-09-22 02:20:22 +00:00
standardKtorSerialFormatContentType
)
}
suspend fun <T> ApplicationCall.uniload(
deserializer: DeserializationStrategy<T>
2020-09-26 15:42:05 +00:00
) = safely {
standardKtorSerialFormat.decodeDefault(
deserializer,
receive()
)
}
2020-09-22 02:20:22 +00:00
suspend fun ApplicationCall.getParameterOrSendError(
field: String
) = parameters[field].also {
if (it == null) {
respond(HttpStatusCode.BadRequest, "Request must contains $field")
}
}
fun ApplicationCall.getQueryParameter(
field: String
) = request.queryParameters[field]
suspend fun ApplicationCall.getQueryParameterOrSendError(
field: String
) = getQueryParameter(field).also {
if (it == null) {
respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field")
}
}
fun <T> ApplicationCall.decodeUrlQueryValue(
field: String,
deserializer: DeserializationStrategy<T>
) = getQueryParameter(field) ?.let {
2020-09-26 15:42:05 +00:00
standardKtorSerialFormat.decodeHex(
2020-09-22 02:20:22 +00:00
deserializer,
it
)
}
suspend fun <T> ApplicationCall.decodeUrlQueryValueOrSendError(
field: String,
deserializer: DeserializationStrategy<T>
) = decodeUrlQueryValue(field, deserializer).also {
if (it == null) {
respond(HttpStatusCode.BadRequest, "Request query parameters must contains $field")
}
}