diff --git a/Sources/Core/AWSClientRuntime/Protocols/RestXML/RestXMLError.swift b/Sources/Core/AWSClientRuntime/Protocols/RestXML/RestXMLError.swift index 25277bbf445..2efacb7dc68 100644 --- a/Sources/Core/AWSClientRuntime/Protocols/RestXML/RestXMLError.swift +++ b/Sources/Core/AWSClientRuntime/Protocols/RestXML/RestXMLError.swift @@ -20,7 +20,7 @@ public struct RestXMLError { let reader = Self.errorBodyReader(responseReader: responseReader, noErrorWrapping: noErrorWrapping) let code: String? = try reader["Code"].readIfPresent() let message: String? = try reader["Message"].readIfPresent() - let requestID: String? = try reader["RequestId"].readIfPresent() + let requestID: String? = try responseReader["RequestId"].readIfPresent() guard let code, let requestID else { throw RestXMLDecodeError.missingRequiredData } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpBindingProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpBindingProtocolGenerator.kt index e5503373442..5e130f9c323 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpBindingProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpBindingProtocolGenerator.kt @@ -21,7 +21,6 @@ import software.amazon.smithy.swift.codegen.SwiftWriter import software.amazon.smithy.swift.codegen.integration.HttpBindingProtocolGenerator import software.amazon.smithy.swift.codegen.integration.HttpProtocolTestGenerator import software.amazon.smithy.swift.codegen.integration.HttpProtocolUnitTestErrorGenerator -import software.amazon.smithy.swift.codegen.integration.HttpProtocolUnitTestGenerator import software.amazon.smithy.swift.codegen.integration.HttpProtocolUnitTestRequestGenerator import software.amazon.smithy.swift.codegen.integration.HttpProtocolUnitTestResponseGenerator import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator @@ -45,10 +44,6 @@ abstract class AWSHttpBindingProtocolGenerator : HttpBindingProtocolGenerator() override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory() - val serdeContextJSON = HttpProtocolUnitTestGenerator.SerdeContext("JSONEncoder()", "JSONDecoder()", ".secondsSince1970") - val serdeContextXML = HttpProtocolUnitTestGenerator.SerdeContext("XMLEncoder()", "XMLDecoder()") - abstract val serdeContext: HttpProtocolUnitTestGenerator.SerdeContext - val requestTestBuilder = HttpProtocolUnitTestRequestGenerator.Builder() val responseTestBuilder = HttpProtocolUnitTestResponseGenerator.Builder() val errorTestBuilder = HttpProtocolUnitTestErrorGenerator.Builder() @@ -68,7 +63,6 @@ abstract class AWSHttpBindingProtocolGenerator : HttpBindingProtocolGenerator() httpProtocolCustomizable, operationMiddleware, getProtocolHttpBindingResolver(ctx, defaultContentType), - serdeContext, imports, testsToIgnore, tagsToIgnore, diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpRequestXMLEncoder.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpRequestXMLEncoder.kt deleted file mode 100644 index a3ecbb642ce..00000000000 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpRequestXMLEncoder.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ - -package software.amazon.smithy.aws.swift.codegen - -import software.amazon.smithy.swift.codegen.ClientRuntimeTypes -import software.amazon.smithy.swift.codegen.integration.HttpRequestEncoder - -class AWSHttpRequestXMLEncoder( - requestEncoderOptions: MutableMap = mutableMapOf() -) : HttpRequestEncoder(ClientRuntimeTypes.Serde.JSONEncoder, requestEncoderOptions) diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpResponseXMLDecoder.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpResponseXMLDecoder.kt deleted file mode 100644 index 29a8df20919..00000000000 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpResponseXMLDecoder.kt +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0. - */ - -package software.amazon.smithy.aws.swift.codegen - -import software.amazon.smithy.swift.codegen.ClientRuntimeTypes -import software.amazon.smithy.swift.codegen.integration.HttpResponseDecoder - -class AWSHttpResponseXMLDecoder( - responseDecoderOptions: MutableMap = mutableMapOf() -) : HttpResponseDecoder(ClientRuntimeTypes.Serde.JSONDecoder, responseDecoderOptions) diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/XMLMessageUnmarshallableGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/XMLMessageUnmarshallableGenerator.kt index bd84cb26c73..21a45af59cd 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/XMLMessageUnmarshallableGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/XMLMessageUnmarshallableGenerator.kt @@ -41,76 +41,78 @@ class XMLMessageUnmarshallableGenerator(val ctx: ProtocolGenerator.GenerationCon writer.addImport(AWSSwiftDependency.AWS_CLIENT_RUNTIME.target) writer.openBlock("extension \$L {", "}", streamSymbol.fullName) { writer.openBlock( - "static func unmarshal(message: \$N) throws -> \$N {", "}", - ClientRuntimeTypes.EventStream.Message, + "static var unmarshal: \$N<\$N> {", "}", + ClientRuntimeTypes.EventStream.UnmarshalClosure, streamSymbol, ) { - writer.write("switch try message.type() {") - writer.write("case .event(let params):") - writer.indent { - writer.write("switch params.eventType {") - streamShape.eventStreamEvents(ctx.model).forEach { member -> - writer.write("case \"${member.memberName}\":") - writer.indent { - renderDeserializeEventVariant(ctx, streamSymbol, member, writer) - } - } - writer.write("default:") + writer.openBlock("{ message in", "}") { + writer.write("switch try message.type() {") + writer.write("case .event(let params):") writer.indent { - writer.write("return .sdkUnknown(\"error processing event stream, unrecognized event: \\(params.eventType)\")") - } - writer.write("}") - } - writer.write("case .exception(let params):") - writer.indent { - writer.write( - "let makeError: (\$N, \$N) throws -> \$N = { message, params in", - ClientRuntimeTypes.EventStream.Message, - ClientRuntimeTypes.EventStream.ExceptionParams, - SwiftTypes.Error - ) - writer.indent { - writer.write("switch params.exceptionType {") - streamShape.eventStreamErrors(ctx.model).forEach { member -> + writer.write("switch params.eventType {") + streamShape.eventStreamEvents(ctx.model).forEach { member -> writer.write("case \"${member.memberName}\":") writer.indent { - val targetShape = ctx.model.expectShape(member.target) - val symbol = ctx.symbolProvider.toSymbol(targetShape) - writer.write("return try decoder.decode(responseBody: message.payload) as \$N", symbol) + renderDeserializeEventVariant(ctx, streamSymbol, member, writer) } } writer.write("default:") writer.indent { - writer.write("let httpResponse = HttpResponse(body: .data(message.payload), statusCode: .ok)") - writer.write( - "return \$L(httpResponse: httpResponse, message: \"error processing event stream, unrecognized ':exceptionType': \\(params.exceptionType); contentType: \\(params.contentType ?? \"nil\")\", requestID: nil, typeName: nil)", - AWSClientRuntimeTypes.Core.UnknownAWSHTTPServiceError - ) + writer.write("return .sdkUnknown(\"error processing event stream, unrecognized event: \\(params.eventType)\")") } writer.write("}") } + writer.write("case .exception(let params):") + writer.indent { + writer.write( + "let makeError: (\$N, \$N) throws -> \$N = { message, params in", + ClientRuntimeTypes.EventStream.Message, + ClientRuntimeTypes.EventStream.ExceptionParams, + SwiftTypes.Error + ) + writer.indent { + writer.write("switch params.exceptionType {") + streamShape.eventStreamErrors(ctx.model).forEach { member -> + writer.write("case \"${member.memberName}\":") + writer.indent { + val targetShape = ctx.model.expectShape(member.target) + val symbol = ctx.symbolProvider.toSymbol(targetShape) + writer.write("return try decoder.decode(responseBody: message.payload) as \$N", symbol) + } + } + writer.write("default:") + writer.indent { + writer.write("let httpResponse = HttpResponse(body: .data(message.payload), statusCode: .ok)") + writer.write( + "return \$L(httpResponse: httpResponse, message: \"error processing event stream, unrecognized ':exceptionType': \\(params.exceptionType); contentType: \\(params.contentType ?? \"nil\")\", requestID: nil, typeName: nil)", + AWSClientRuntimeTypes.Core.UnknownAWSHTTPServiceError + ) + } + writer.write("}") + } + writer.write("}") + writer.write("let error = try makeError(message, params)") + writer.write("throw error") + } + writer.write("case .error(let params):") + writer.indent { + // this is a service exception still, just un-modeled + writer.write("let httpResponse = HttpResponse(body: .data(message.payload), statusCode: .ok)") + writer.write( + "throw \$L(httpResponse: httpResponse, message: \"error processing event stream, unrecognized ':errorType': \\(params.errorCode); message: \\(params.message ?? \"nil\")\", requestID: nil, typeName: nil)", + AWSClientRuntimeTypes.Core.UnknownAWSHTTPServiceError + ) + } + writer.write("case .unknown(messageType: let messageType):") + writer.indent { + // this is a client exception because we failed to parse it + writer.write( + "throw \$L(\"unrecognized event stream message ':message-type': \\(messageType)\")", + ClientRuntimeTypes.Core.UnknownClientError + ) + } writer.write("}") - writer.write("let error = try makeError(message, params)") - writer.write("throw error") - } - writer.write("case .error(let params):") - writer.indent { - // this is a service exception still, just un-modeled - writer.write("let httpResponse = HttpResponse(body: .data(message.payload), statusCode: .ok)") - writer.write( - "throw \$L(httpResponse: httpResponse, message: \"error processing event stream, unrecognized ':errorType': \\(params.errorCode); message: \\(params.message ?? \"nil\")\", requestID: nil, typeName: nil)", - AWSClientRuntimeTypes.Core.UnknownAWSHTTPServiceError - ) - } - writer.write("case .unknown(messageType: let messageType):") - writer.indent { - // this is a client exception because we failed to parse it - writer.write( - "throw \$L(\"unrecognized event stream message ':message-type': \\(messageType)\")", - ClientRuntimeTypes.Core.UnknownClientError - ) } - writer.write("}") } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_0_ProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_0_ProtocolGenerator.kt index 052e9b68efe..903a060845b 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_0_ProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_0_ProtocolGenerator.kt @@ -36,7 +36,6 @@ open class AwsJson1_0_ProtocolGenerator : AWSHttpBindingProtocolGenerator() { HttpResponseBindingOutputGenerator(), AWSJsonHttpResponseBindingErrorGenerator() ) - override val serdeContext = serdeContextJSON override val shouldRenderEncodableConformance: Boolean = true override val shouldRenderDecodableBodyStructForInputShapes: Boolean = true override val testsToIgnore = setOf( diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_1_ProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_1_ProtocolGenerator.kt index 1994e2614e1..f499e553e5a 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_1_ProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_1_ProtocolGenerator.kt @@ -36,7 +36,6 @@ class AwsJson1_1_ProtocolGenerator : AWSHttpBindingProtocolGenerator() { HttpResponseBindingOutputGenerator(), AWSJsonHttpResponseBindingErrorGenerator() ) - override val serdeContext = serdeContextJSON override val shouldRenderEncodableConformance: Boolean = true override val shouldRenderDecodableBodyStructForInputShapes: Boolean = true override val testsToIgnore = setOf( diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AWSHttpProtocolAwsQueryCustomizations.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AWSHttpProtocolAwsQueryCustomizations.kt index 1e9e5a4704d..d55568400e6 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AWSHttpProtocolAwsQueryCustomizations.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AWSHttpProtocolAwsQueryCustomizations.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.aws.swift.codegen.awsquery import software.amazon.smithy.aws.swift.codegen.AWSHttpProtocolCustomizations import software.amazon.smithy.aws.swift.codegen.AWSHttpRequestFormURLEncoder -import software.amazon.smithy.aws.swift.codegen.AWSHttpResponseXMLDecoder import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.protocoltests.traits.HttpRequestTestCase @@ -19,9 +18,7 @@ class AWSHttpProtocolAwsQueryCustomizations : AWSHttpProtocolCustomizations() { override fun getClientProperties(): List { val properties = mutableListOf() val requestEncoderOptions = mutableMapOf() - val responseDecoderOptions = mutableMapOf() properties.add(AWSHttpRequestFormURLEncoder(requestEncoderOptions)) - properties.add(AWSHttpResponseXMLDecoder(responseDecoderOptions)) return properties } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AwsQueryProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AwsQueryProtocolGenerator.kt index e49596e9b25..ade070766f4 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AwsQueryProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AwsQueryProtocolGenerator.kt @@ -47,7 +47,6 @@ open class AwsQueryProtocolGenerator : AWSHttpBindingProtocolGenerator() { AWSXMLHttpResponseBindingErrorInitGeneratorFactory(), ) - override val serdeContext = HttpProtocolUnitTestGenerator.SerdeContext("FormURLEncoder()", "XMLDecoder()") override fun getProtocolHttpBindingResolver(ctx: ProtocolGenerator.GenerationContext, defaultContentType: String): HttpBindingResolver = FormURLHttpBindingResolver(ctx, defaultContentType) diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/httpResponse/AWSQueryHttpResponseBindingErrorGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/httpResponse/AWSQueryHttpResponseBindingErrorGenerator.kt index 7d741484e37..508048295de 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/httpResponse/AWSQueryHttpResponseBindingErrorGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/httpResponse/AWSQueryHttpResponseBindingErrorGenerator.kt @@ -79,38 +79,39 @@ class AWSQueryHttpResponseBindingErrorGenerator : HttpResponseBindingErrorGenera writer.addImport(SwiftDependency.SMITHY_XML.target) writer.write("") openBlock( - "static func responseErrorBinding(httpResponse: \$N, reader responseReader: \$N) async throws -> \$N {", "}", - ClientRuntimeTypes.Http.HttpResponse, + "static var httpBinding: \$N<\$N> {", "}", + ClientRuntimeTypes.Http.HTTPResponseErrorBinding, SmithyXMLTypes.Reader, - SwiftTypes.Error ) { - if (ctx.service.errors.isNotEmpty()) { - write("let serviceError = try await ${ctx.symbolProvider.toSymbol(ctx.service).name}Types.makeServiceError(httpResponse, decoder, ec2QueryError)") - write("if let error = serviceError { return error }") - } - writer.write("let reader = responseReader[\"Error\"]") - writer.write("let type: String? = try reader[\"Type\"].readIfPresent()") - writer.write("let requestID: String? = try responseReader[\"RequestId\"].readIfPresent()") - writer.write("let errorCode: String? = try reader[\"Code\"].readIfPresent()") - writer.write("let message: String? = try reader[\"Message\"].readIfPresent()") - openBlock("switch errorCode {", "}") { - val errorShapes = op.errors - .map { ctx.model.expectShape(it) as StructureShape } - .toSet() - .sorted() - errorShapes.forEach { errorShape -> - var errorShapeName = errorShape.errorShapeName(ctx.symbolProvider) - var errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name + writer.openBlock("{ httpResponse, responseReader in", "}") { + if (ctx.service.errors.isNotEmpty()) { + write("let serviceError = try await ${ctx.symbolProvider.toSymbol(ctx.service).name}Types.makeServiceError(httpResponse, decoder, ec2QueryError)") + write("if let error = serviceError { return error }") + } + writer.write("let reader = responseReader[\"Error\"]") + writer.write("let type: String? = try reader[\"Type\"].readIfPresent()") + writer.write("let requestID: String? = try responseReader[\"RequestId\"].readIfPresent()") + writer.write("let errorCode: String? = try reader[\"Code\"].readIfPresent()") + writer.write("let message: String? = try reader[\"Message\"].readIfPresent()") + openBlock("switch errorCode {", "}") { + val errorShapes = op.errors + .map { ctx.model.expectShape(it) as StructureShape } + .toSet() + .sorted() + errorShapes.forEach { errorShape -> + var errorShapeName = errorShape.errorShapeName(ctx.symbolProvider) + var errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name + write( + "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: reader, message: message, requestID: requestID)", + errorShapeName, + errorShapeType + ) + } write( - "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: reader, message: message, requestID: requestID)", - errorShapeName, - errorShapeType + "default: return try await \$N.makeError(httpResponse: httpResponse, message: message, requestID: requestID, typeName: errorCode)", + unknownServiceErrorSymbol ) } - write( - "default: return try await \$N.makeError(httpResponse: httpResponse, message: message, requestID: requestID, typeName: errorCode)", - unknownServiceErrorSymbol - ) } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/route53/Route53InvalidBatchErrorIntegration.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/route53/Route53InvalidBatchErrorIntegration.kt index 57f3a778760..e7fb0b89810 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/route53/Route53InvalidBatchErrorIntegration.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/route53/Route53InvalidBatchErrorIntegration.kt @@ -46,7 +46,7 @@ class Route53InvalidBatchErrorIntegration : SwiftIntegration { } private fun renderCustomInvalidBatchError(writer: SwiftWriter) { - writer.openBlock("struct CustomInvalidBatchError: Decodable {", "}") { + writer.openBlock("struct CustomInvalidBatchError {", "}") { writer.write("") writer.openBlock("struct Message: Decodable {", "}") { writer.write("let message: String") diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/s3/S3ErrorIntegration.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/s3/S3ErrorIntegration.kt index 76518e37e8c..459fd4bef85 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/s3/S3ErrorIntegration.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/customization/s3/S3ErrorIntegration.kt @@ -62,7 +62,14 @@ class S3ErrorIntegration : SwiftIntegration { private val httpResponseBinding = SectionWriter { writer, _ -> val ctx = writer.getContext("ctx") as ProtocolGenerator.GenerationContext val errorShapes = writer.getContext("errorShapes") as List - + val noErrorWrapping = ctx.service.getTrait()?.let { it.isNoErrorWrapping } ?: false + if (errorShapes.isNotEmpty() || ctx.service.errors.isNotEmpty()) { + writer.write( + "let errorBodyReader = \$N.errorBodyReader(responseReader: responseReader, noErrorWrapping: \$L)", + AWSClientRuntimeTypes.RestXML.RestXMLError, + noErrorWrapping + ) + } if (ctx.service.errors.isNotEmpty()) { writer.openBlock( "if let serviceError = try await \$NTypes.responseErrorServiceBinding(httpResponse, errorBodyReader)", @@ -72,8 +79,6 @@ class S3ErrorIntegration : SwiftIntegration { writer.write("return serviceError") } } - val noErrorWrapping = ctx.service.getTrait()?.let { it.isNoErrorWrapping } ?: false - writer.write("let errorBodyReader = \$N.errorBodyReader(responseReader: responseReader, noErrorWrapping: \$L)", AWSClientRuntimeTypes.RestXML.RestXMLError, noErrorWrapping) writer.write("let restXMLError = try \$N(responseReader: responseReader, noErrorWrapping: \$L)", AWSClientRuntimeTypes.RestXML.RestXMLError, noErrorWrapping) writer.openBlock("switch restXMLError.code {", "}") { for (errorShape in errorShapes) { diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/AWSHttpProtocolEc2QueryCustomizations.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/AWSHttpProtocolEc2QueryCustomizations.kt index 19ee3fed6d6..eaa013764c9 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/AWSHttpProtocolEc2QueryCustomizations.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/AWSHttpProtocolEc2QueryCustomizations.kt @@ -7,7 +7,6 @@ package software.amazon.smithy.aws.swift.codegen.ec2query import software.amazon.smithy.aws.swift.codegen.AWSHttpProtocolCustomizations import software.amazon.smithy.aws.swift.codegen.AWSHttpRequestFormURLEncoder -import software.amazon.smithy.aws.swift.codegen.AWSHttpResponseXMLDecoder import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.Shape import software.amazon.smithy.protocoltests.traits.HttpRequestTestCase @@ -19,9 +18,7 @@ class AWSHttpProtocolEc2QueryCustomizations : AWSHttpProtocolCustomizations() { override fun getClientProperties(): List { val properties = mutableListOf() val requestEncoderOptions = mutableMapOf() - val responseDecoderOptions = mutableMapOf() properties.add(AWSHttpRequestFormURLEncoder(requestEncoderOptions)) - properties.add(AWSHttpResponseXMLDecoder(responseDecoderOptions)) return properties } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/Ec2QueryProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/Ec2QueryProtocolGenerator.kt index effea03b9d5..4d52bc5cea5 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/Ec2QueryProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/Ec2QueryProtocolGenerator.kt @@ -45,7 +45,6 @@ class Ec2QueryProtocolGenerator : AWSHttpBindingProtocolGenerator() { AWSEc2QueryHttpResponseBindingErrorInitGeneratorFactory(), ) - override val serdeContext = HttpProtocolUnitTestGenerator.SerdeContext("FormURLEncoder()", "XMLDecoder()") override fun getProtocolHttpBindingResolver(ctx: ProtocolGenerator.GenerationContext, contentType: String): HttpBindingResolver = FormURLHttpBindingResolver(ctx, contentType) diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/httpResponse/AWSEc2QueryHttpResponseBindingErrorGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/httpResponse/AWSEc2QueryHttpResponseBindingErrorGenerator.kt index 67d87609384..1616592fbcb 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/httpResponse/AWSEc2QueryHttpResponseBindingErrorGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/httpResponse/AWSEc2QueryHttpResponseBindingErrorGenerator.kt @@ -79,37 +79,38 @@ class AWSEc2QueryHttpResponseBindingErrorGenerator : HttpResponseBindingErrorGen writer.addImport(SwiftDependency.SMITHY_XML.target) writer.write("") openBlock( - "static func responseErrorBinding(httpResponse: \$N, reader responseReader: \$N) async throws -> \$N {", "}", - ClientRuntimeTypes.Http.HttpResponse, + "static var httpBinding: \$N<\$N> {", "}", + ClientRuntimeTypes.Http.HTTPResponseErrorBinding, SmithyXMLTypes.Reader, - SwiftTypes.Error ) { - if (ctx.service.errors.isNotEmpty()) { - write("let serviceError = try await ${ctx.symbolProvider.toSymbol(ctx.service).name}Types.makeServiceError(httpResponse, decoder, ec2QueryError)") - write("if let error = serviceError { return error }") - } - writer.write("let reader = responseReader[\"Errors\"][\"Error\"]") - writer.write("let requestID: String? = try responseReader[\"RequestId\"].readIfPresent()") - writer.write("let errorCode: String? = try reader[\"Code\"].readIfPresent()") - writer.write("let message: String? = try reader[\"Message\"].readIfPresent()") - openBlock("switch errorCode {", "}") { - val errorShapes = op.errors - .map { ctx.model.expectShape(it) as StructureShape } - .toSet() - .sorted() - errorShapes.forEach { errorShape -> - var errorShapeName = errorShape.errorShapeName(ctx.symbolProvider) - var errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name + writer.openBlock("{ httpResponse, responseReader in", "}") { + if (ctx.service.errors.isNotEmpty()) { + write("let serviceError = try await ${ctx.symbolProvider.toSymbol(ctx.service).name}Types.makeServiceError(httpResponse, decoder, ec2QueryError)") + write("if let error = serviceError { return error }") + } + writer.write("let reader = responseReader[\"Errors\"][\"Error\"]") + writer.write("let requestID: String? = try responseReader[\"RequestId\"].readIfPresent()") + writer.write("let errorCode: String? = try reader[\"Code\"].readIfPresent()") + writer.write("let message: String? = try reader[\"Message\"].readIfPresent()") + openBlock("switch errorCode {", "}") { + val errorShapes = op.errors + .map { ctx.model.expectShape(it) as StructureShape } + .toSet() + .sorted() + errorShapes.forEach { errorShape -> + var errorShapeName = errorShape.errorShapeName(ctx.symbolProvider) + var errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name + write( + "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: reader, message: message, requestID: requestID)", + errorShapeName, + errorShapeType + ) + } write( - "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: reader, message: message, requestID: requestID)", - errorShapeName, - errorShapeType + "default: return try await \$N.makeError(httpResponse: httpResponse, message: message, requestID: requestID, typeName: errorCode)", + unknownServiceErrorSymbol ) } - write( - "default: return try await \$N.makeError(httpResponse: httpResponse, message: message, requestID: requestID, typeName: errorCode)", - unknownServiceErrorSymbol - ) } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restjson/AWSRestJson1ProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restjson/AWSRestJson1ProtocolGenerator.kt index 8d36071444c..1a7402c8c72 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restjson/AWSRestJson1ProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restjson/AWSRestJson1ProtocolGenerator.kt @@ -29,7 +29,6 @@ class AWSRestJson1ProtocolGenerator : AWSHttpBindingProtocolGenerator() { HttpResponseBindingOutputGenerator(), AWSRestJson1HttpResponseBindingErrorGeneratable() ) - override val serdeContext = serdeContextJSON override val testsToIgnore = setOf( "SDKAppliedContentEncoding_restJson1", "SDKAppendedGzipAfterProvidedEncoding_restJson1", diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSHttpProtocolRestXMLCustomizations.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSHttpProtocolRestXMLCustomizations.kt index 2cb5be2c821..bc75db1fb75 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSHttpProtocolRestXMLCustomizations.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSHttpProtocolRestXMLCustomizations.kt @@ -6,18 +6,11 @@ package software.amazon.smithy.aws.swift.codegen.restxml import software.amazon.smithy.aws.swift.codegen.AWSHttpProtocolCustomizations -import software.amazon.smithy.aws.swift.codegen.AWSHttpRequestXMLEncoder -import software.amazon.smithy.aws.swift.codegen.AWSHttpResponseXMLDecoder import software.amazon.smithy.swift.codegen.integration.ClientProperty class AWSHttpProtocolRestXMLCustomizations : AWSHttpProtocolCustomizations() { override fun getClientProperties(): List { - val properties = mutableListOf() - val requestEncoderOptions = mutableMapOf() - val responseDecoderOptions = mutableMapOf() - properties.add(AWSHttpRequestXMLEncoder(requestEncoderOptions)) - properties.add(AWSHttpResponseXMLDecoder(responseDecoderOptions)) - return properties + return listOf() } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSRestXMLHttpResponseBindingErrorGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSRestXMLHttpResponseBindingErrorGenerator.kt index c87e0bb5784..b7711f6b11a 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSRestXMLHttpResponseBindingErrorGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/AWSRestXMLHttpResponseBindingErrorGenerator.kt @@ -12,6 +12,7 @@ import software.amazon.smithy.codegen.core.Symbol import software.amazon.smithy.model.shapes.OperationShape import software.amazon.smithy.model.shapes.StructureShape import software.amazon.smithy.swift.codegen.ClientRuntimeTypes +import software.amazon.smithy.swift.codegen.SmithyReadWriteTypes import software.amazon.smithy.swift.codegen.SmithyXMLTypes import software.amazon.smithy.swift.codegen.SwiftDependency import software.amazon.smithy.swift.codegen.SwiftTypes @@ -52,7 +53,7 @@ class AWSRestXMLHttpResponseBindingErrorGenerator : HttpResponseBindingErrorGene val errorShapeName = errorShape.errorShapeName(ctx.symbolProvider) val errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name write( - "case \$S: return try await \$L(httpResponse: httpResponse, decoder: decoder, message: error.message, requestID: error.requestId)", + "case \$S: return try await \$L(httpResponse: httpResponse, reader: reader, message: error.message, requestID: error.requestId)", errorShapeName, errorShapeType ) @@ -85,11 +86,11 @@ class AWSRestXMLHttpResponseBindingErrorGenerator : HttpResponseBindingErrorGene "}", operationErrorName ) { + write("") openBlock( - "static func responseErrorBinding(httpResponse: \$N, reader responseReader: \$N) async throws -> \$N {", "}", - ClientRuntimeTypes.Http.HttpResponse, + "static var httpBinding: \$N<\$N> {", "}", + ClientRuntimeTypes.Http.HTTPResponseErrorBinding, SmithyXMLTypes.Reader, - SwiftTypes.Error ) { val errorShapes = op.errors .map { ctx.model.expectShape(it) as StructureShape } @@ -101,31 +102,38 @@ class AWSRestXMLHttpResponseBindingErrorGenerator : HttpResponseBindingErrorGene "unknownServiceErrorSymbol" to unknownServiceErrorSymbol, "errorShapes" to errorShapes ) - declareSection(RestXMLResponseBindingSectionId, context) { - - if (ctx.service.errors.isNotEmpty()) { - openBlock( - "if let serviceError = try await \$NTypes.responseErrorServiceBinding(httpResponse, errorBodyReader)", - "}", - ctx.symbolProvider.toSymbol(ctx.service), - ) { - write("return serviceError") - } - } - val noErrorWrapping = ctx.service.getTrait()?.let { it.isNoErrorWrapping } ?: false - writer.write("let errorBodyReader = \$N.errorBodyReader(responseReader: responseReader, noErrorWrapping: \$L)", AWSClientRuntimeTypes.RestXML.RestXMLError, noErrorWrapping) - writer.write("let restXMLError = try \$N(responseReader: responseReader, noErrorWrapping: \$L)", AWSClientRuntimeTypes.RestXML.RestXMLError, noErrorWrapping) - openBlock("switch restXMLError.code {", "}") { - errorShapes.forEach { errorShape -> - val errorShapeName = errorShape.id.name - val errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name - write( - "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: errorBodyReader, message: restXMLError.message, requestID: restXMLError.requestID)", - errorShapeName, - errorShapeType + writer.openBlock("{ httpResponse, responseReader in", "}") { + declareSection(RestXMLResponseBindingSectionId, context) { + val noErrorWrapping = ctx.service.getTrait()?.let { it.isNoErrorWrapping } ?: false + if (errorShapes.isNotEmpty() || ctx.service.errors.isNotEmpty()) { + writer.write( + "let errorBodyReader = \$N.errorBodyReader(responseReader: responseReader, noErrorWrapping: \$L)", + AWSClientRuntimeTypes.RestXML.RestXMLError, + noErrorWrapping ) } - write("default: return try await \$unknownServiceErrorSymbol:N.makeError(httpResponse: httpResponse, message: restXMLError.message, requestID: restXMLError.requestID, typeName: restXMLError.code)") + if (ctx.service.errors.isNotEmpty()) { + openBlock( + "if let serviceError = try await \$NTypes.responseServiceErrorBinding(httpResponse, errorBodyReader)", + "}", + ctx.symbolProvider.toSymbol(ctx.service), + ) { + write("return serviceError") + } + } + writer.write("let restXMLError = try \$N(responseReader: responseReader, noErrorWrapping: \$L)", AWSClientRuntimeTypes.RestXML.RestXMLError, noErrorWrapping) + openBlock("switch restXMLError.code {", "}") { + errorShapes.forEach { errorShape -> + val errorShapeName = errorShape.id.name + val errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name + write( + "case \$S: return try await \$L.responseErrorBinding(httpResponse: httpResponse, reader: errorBodyReader, message: restXMLError.message, requestID: restXMLError.requestID)", + errorShapeName, + errorShapeType + ) + } + write("default: return try await \$unknownServiceErrorSymbol:N.makeError(httpResponse: httpResponse, message: restXMLError.message, requestID: restXMLError.requestID, typeName: restXMLError.code)") + } } } } diff --git a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/RestXmlProtocolGenerator.kt b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/RestXmlProtocolGenerator.kt index 36ca84ffb58..9a787fc76db 100644 --- a/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/RestXmlProtocolGenerator.kt +++ b/codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restxml/RestXmlProtocolGenerator.kt @@ -35,7 +35,6 @@ class RestXmlProtocolGenerator : AWSHttpBindingProtocolGenerator() { ) override val shouldRenderDecodableBodyStructForInputShapes = false override val shouldRenderCodingKeysForEncodable = false - override val serdeContext = serdeContextXML override val testsToIgnore = setOf( "S3DefaultAddressing", "S3VirtualHostAddressing",