All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.aws.sdk.kotlin.services.lexruntimev2.transform.StartConversationOperationSerializer.kt Maven / Gradle / Ivy

// Code generated by smithy-kotlin-codegen. DO NOT EDIT!

package aws.sdk.kotlin.services.lexruntimev2.transform

import aws.sdk.kotlin.services.lexruntimev2.model.ConversationMode
import aws.sdk.kotlin.services.lexruntimev2.model.StartConversationRequest
import aws.sdk.kotlin.services.lexruntimev2.model.StartConversationRequestEventStream
import aws.smithy.kotlin.runtime.auth.awssigning.AwsSigningAttributes
import aws.smithy.kotlin.runtime.auth.awssigning.DefaultAwsSigner
import aws.smithy.kotlin.runtime.auth.awssigning.HashSpecification
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.HeaderValue
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.Message
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.asEventStreamHttpBody
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.buildMessage
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.encode
import aws.smithy.kotlin.runtime.awsprotocol.eventstream.sign
import aws.smithy.kotlin.runtime.http.HttpBody
import aws.smithy.kotlin.runtime.http.HttpMethod
import aws.smithy.kotlin.runtime.http.content.ByteArrayContent
import aws.smithy.kotlin.runtime.http.operation.HttpSerialize
import aws.smithy.kotlin.runtime.http.request.HttpRequestBuilder
import aws.smithy.kotlin.runtime.http.request.headers
import aws.smithy.kotlin.runtime.http.request.url
import aws.smithy.kotlin.runtime.http.util.encodeLabel
import aws.smithy.kotlin.runtime.operation.ExecutionContext
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.job


internal class StartConversationOperationSerializer: HttpSerialize {
    override suspend fun serialize(context: ExecutionContext, input: StartConversationRequest): HttpRequestBuilder {
        val builder = HttpRequestBuilder()
        builder.method = HttpMethod.POST

        builder.url {
            val pathSegments = listOf(
                "bots",
                "${input.botId}".encodeLabel(),
                "botAliases",
                "${input.botAliasId}".encodeLabel(),
                "botLocales",
                "${input.localeId}".encodeLabel(),
                "sessions",
                "${input.sessionId}".encodeLabel(),
                "conversation",
            )
            path = pathSegments.joinToString(separator = "/", prefix = "/")
        }

        builder.headers {
            if (input.conversationMode != null) append("x-amz-lex-conversation-mode", input.conversationMode.value)
        }

        builder.body = serializeStartConversationOperationBody(context, input)
        return builder
    }
}

internal suspend fun serializeStartConversationOperationBody(context: ExecutionContext, input: StartConversationRequest): HttpBody {
    val stream = input.requestEventStream ?: return HttpBody.Empty
    context[AwsSigningAttributes.HashSpecification] = HashSpecification.EmptyBody
    context[AwsSigningAttributes.Signer] = DefaultAwsSigner
    context[AwsSigningAttributes.RequestSignature] = CompletableDeferred(context.coroutineContext.job)
    val messages = stream
        .map(::encodeStartConversationStartConversationRequestEventStreamEventMessage)
        .sign(context)
        .encode()

    return messages.asEventStreamHttpBody(context)
}

private fun encodeStartConversationStartConversationRequestEventStreamEventMessage(input: StartConversationRequestEventStream): Message = buildMessage {
    addHeader(":message-type", HeaderValue.String("event"))
    when(input) {
        is StartConversationRequestEventStream.ConfigurationEvent -> {
            addHeader(":event-type", HeaderValue.String("ConfigurationEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializeConfigurationEventPayload(input.value)
        }
        is StartConversationRequestEventStream.AudioInputEvent -> {
            addHeader(":event-type", HeaderValue.String("AudioInputEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializeAudioInputEventPayload(input.value)
        }
        is StartConversationRequestEventStream.DtmfInputEvent -> {
            addHeader(":event-type", HeaderValue.String("DTMFInputEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializeDtmfInputEventPayload(input.value)
        }
        is StartConversationRequestEventStream.TextInputEvent -> {
            addHeader(":event-type", HeaderValue.String("TextInputEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializeTextInputEventPayload(input.value)
        }
        is StartConversationRequestEventStream.PlaybackCompletionEvent -> {
            addHeader(":event-type", HeaderValue.String("PlaybackCompletionEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializePlaybackCompletionEventPayload(input.value)
        }
        is StartConversationRequestEventStream.DisconnectionEvent -> {
            addHeader(":event-type", HeaderValue.String("DisconnectionEvent"))
            addHeader(":content-type", HeaderValue.String("application/json"))
            payload = serializeDisconnectionEventPayload(input.value)
        }
        is StartConversationRequestEventStream.SdkUnknown -> error("cannot serialize the unknown event type!")
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy