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

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

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

package aws.sdk.kotlin.services.lexruntimev2.serde

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.operation.HttpSerializer
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.operation.ExecutionContext
import aws.smithy.kotlin.runtime.text.encoding.PercentEncoding
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.job


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

        builder.url {
            requireNotNull(input.botId) { "botId is bound to the URI and must not be null" }
            requireNotNull(input.botAliasId) { "botAliasId is bound to the URI and must not be null" }
            requireNotNull(input.localeId) { "localeId is bound to the URI and must not be null" }
            requireNotNull(input.sessionId) { "sessionId is bound to the URI and must not be null" }
            path.encodedSegments {
                add(PercentEncoding.Path.encode("bots"))
                add(PercentEncoding.SmithyLabel.encode(input.botId))
                add(PercentEncoding.Path.encode("botAliases"))
                add(PercentEncoding.SmithyLabel.encode(input.botAliasId))
                add(PercentEncoding.Path.encode("botLocales"))
                add(PercentEncoding.SmithyLabel.encode(input.localeId))
                add(PercentEncoding.Path.encode("sessions"))
                add(PercentEncoding.SmithyLabel.encode(input.sessionId))
                add(PercentEncoding.Path.encode("conversation"))
            }
        }

        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