Skip to content

Commit 6efe36b

Browse files
authored
feat: adding s3 requestId2, s3 customization (#363)
1 parent 743fd39 commit 6efe36b

File tree

13 files changed

+154
-10
lines changed

13 files changed

+154
-10
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/*
2+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
3+
* SPDX-License-Identifier: Apache-2.0.
4+
*/
5+
6+
import ClientRuntime
7+
8+
public protocol S3HttpServiceError: AWSHttpServiceError {
9+
var _requestID2: String? { get set }
10+
}

AWSClientRuntime/Sources/Protocols/RestXML/RestXMLError.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ public struct RestXMLError {
3232
requestId = nil
3333
message = nil
3434
}
35+
public init(errorCode: String? = nil, requestId: String? = nil, message: String? = nil) {
36+
self.errorCode = errorCode
37+
self.requestId = requestId
38+
self.message = message
39+
}
3540
}

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSClientRuntimeTypes.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ object AWSClientRuntimeTypes {
2222
object RestXML {
2323
val RestXMLError = runtimeSymbol("RestXMLError")
2424
val ErrorResponseContainer = runtimeSymbol("ErrorResponseContainer")
25+
object S3 {
26+
val S3HttpServiceError = runtimeSymbol("S3HttpServiceError")
27+
}
2528
}
2629

2730
object Signing {

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/AWSHttpBindingProtocolGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import software.amazon.smithy.swift.codegen.model.ShapeMetadata
2222

2323
abstract class AWSHttpBindingProtocolGenerator : HttpBindingProtocolGenerator() {
2424

25-
override val serviceErrorProtocolSymbol: Symbol = AWSClientRuntimeTypes.Core.AWSHttpServiceError
25+
override var serviceErrorProtocolSymbol: Symbol = AWSClientRuntimeTypes.Core.AWSHttpServiceError
2626

2727
override val unknownServiceErrorSymbol: Symbol = AWSClientRuntimeTypes.Core.UnknownAWSHttpServiceError
2828

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_0_ProtocolGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ open class AwsJson1_0_ProtocolGenerator : AWSHttpBindingProtocolGenerator() {
2525
override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory()
2626
override val httpProtocolCustomizable = AWSHttpProtocolClientCustomizableFactory().constructClientCustomizable(protocol)
2727
override val httpResponseGenerator = HttpResponseGenerator(
28-
serviceErrorProtocolSymbol,
2928
unknownServiceErrorSymbol,
3029
defaultTimestampFormat,
3130
AWSJsonHttpResponseBindingErrorGenerator()

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsjson/AwsJson1_1_ProtocolGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ class AwsJson1_1_ProtocolGenerator : AWSHttpBindingProtocolGenerator() {
2525
override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory()
2626
override val httpProtocolCustomizable = AWSHttpProtocolClientCustomizableFactory().constructClientCustomizable(protocol)
2727
override val httpResponseGenerator = HttpResponseGenerator(
28-
serviceErrorProtocolSymbol,
2928
unknownServiceErrorSymbol,
3029
defaultTimestampFormat,
3130
AWSJsonHttpResponseBindingErrorGenerator()

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/awsquery/AwsQueryProtocolGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ open class AwsQueryProtocolGenerator : AWSHttpBindingProtocolGenerator() {
4444
override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory()
4545
override val httpProtocolCustomizable = AWSHttpProtocolClientCustomizableFactory().constructClientCustomizable(protocol)
4646
override val httpResponseGenerator = HttpResponseGenerator(
47-
serviceErrorProtocolSymbol,
4847
unknownServiceErrorSymbol,
4948
defaultTimestampFormat,
5049
AWSRestXMLHttpResponseBindingErrorGenerator(),
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package software.amazon.smithy.aws.swift.codegen.customization.s3
2+
3+
import software.amazon.smithy.aws.swift.codegen.AWSClientRuntimeTypes
4+
import software.amazon.smithy.aws.swift.codegen.restxml.AWSRestXMLHttpResponseBindingErrorGenerator
5+
import software.amazon.smithy.codegen.core.Symbol
6+
import software.amazon.smithy.model.Model
7+
import software.amazon.smithy.model.shapes.ServiceShape
8+
import software.amazon.smithy.model.shapes.StructureShape
9+
import software.amazon.smithy.swift.codegen.ClientRuntimeTypes
10+
import software.amazon.smithy.swift.codegen.StructureGenerator
11+
import software.amazon.smithy.swift.codegen.SwiftSettings
12+
import software.amazon.smithy.swift.codegen.SwiftTypes
13+
import software.amazon.smithy.swift.codegen.integration.ProtocolGenerator
14+
import software.amazon.smithy.swift.codegen.integration.SectionWriter
15+
import software.amazon.smithy.swift.codegen.integration.SectionWriterBinding
16+
import software.amazon.smithy.swift.codegen.integration.SwiftIntegration
17+
import software.amazon.smithy.swift.codegen.integration.httpResponse.HttpResponseBindingErrorInitGenerator
18+
import software.amazon.smithy.swift.codegen.integration.httpResponse.HttpResponseBindingErrorNarrowGenerator
19+
import software.amazon.smithy.swift.codegen.model.expectShape
20+
21+
class S3ErrorIntegration : SwiftIntegration {
22+
override val order: Byte
23+
get() = 127
24+
25+
override fun enabledForService(model: Model, settings: SwiftSettings): Boolean {
26+
return model.expectShape<ServiceShape>(settings.service).isS3
27+
}
28+
override val sectionWriters: List<SectionWriterBinding>
29+
get() = listOf(
30+
SectionWriterBinding(HttpResponseBindingErrorInitGenerator.HttpResponseBindingErrorInit, s3MembersParams),
31+
SectionWriterBinding(HttpResponseBindingErrorInitGenerator.HttpResponseBindingErrorInitMemberAssignment, s3MembersAssignment),
32+
SectionWriterBinding(StructureGenerator.AdditionalErrorMembers, s3Members),
33+
SectionWriterBinding(HttpResponseBindingErrorNarrowGenerator.HttpResponseBindingErrorNarrowGeneratorSectionId, httpResponseBindingErrorNarrow),
34+
SectionWriterBinding(AWSRestXMLHttpResponseBindingErrorGenerator.RestXMLResponseBindingSectionId, httpResponseBinding)
35+
36+
)
37+
38+
private val s3MembersParams = SectionWriter { writer, _ ->
39+
writer.write(
40+
"public init (httpResponse: \$N, decoder: \$D, message: \$D, requestID: \$D, requestID2: \$D) throws {",
41+
ClientRuntimeTypes.Http.HttpResponse,
42+
ClientRuntimeTypes.Serde.ResponseDecoder,
43+
SwiftTypes.String,
44+
SwiftTypes.String,
45+
SwiftTypes.String
46+
)
47+
}
48+
49+
private val s3MembersAssignment = SectionWriter { writer, _ ->
50+
writer.write("self._requestID2 = requestID2")
51+
}
52+
53+
private val s3Members = SectionWriter { writer, _ ->
54+
writer.write("public var _requestID2: \$T", SwiftTypes.String)
55+
}
56+
57+
private val httpResponseBinding = SectionWriter { writer, _ ->
58+
val operationErrorName = writer.getContext("operationErrorName") as String
59+
writer.write("let errorDetails = $operationErrorName.isNotFoundAndEmptyBody(httpResponse: httpResponse)")
60+
writer.write(" ? $operationErrorName.constructRestXMLError(httpResponse: httpResponse)")
61+
writer.write(" : try \$N(httpResponse: httpResponse)", AWSClientRuntimeTypes.RestXML.RestXMLError)
62+
writer.write("let requestID2 = $operationErrorName.getRequestId2(httpResponse: httpResponse)")
63+
writer.write("try self.init(errorType: errorDetails.errorCode, httpResponse: httpResponse, decoder: decoder, message: errorDetails.message, requestID: errorDetails.requestId, requestID2: requestID2)")
64+
}
65+
66+
private val httpResponseBindingErrorNarrow = SectionWriter { writer, _ ->
67+
val ctx = writer.getContext("ctx") as ProtocolGenerator.GenerationContext
68+
val unknownServiceErrorType = writer.getContext("unknownServiceErrorType") as String
69+
val operationErrorName = writer.getContext("operationErrorName") as String
70+
val errorShapes = writer.getContext("errorShapes") as List<StructureShape>
71+
72+
writer.openBlock("extension \$L {", "}", operationErrorName) {
73+
writer.write(
74+
"public init(errorType: \$T, httpResponse: \$N, decoder: \$D, message: \$D, requestID: \$D, requestID2: \$D) throws {",
75+
SwiftTypes.String,
76+
ClientRuntimeTypes.Http.HttpResponse,
77+
ClientRuntimeTypes.Serde.ResponseDecoder,
78+
SwiftTypes.String,
79+
SwiftTypes.String,
80+
SwiftTypes.String
81+
)
82+
writer.indent()
83+
writer.write("switch errorType {")
84+
for (errorShape in errorShapes) {
85+
var errorShapeName = ctx.symbolProvider.toSymbol(errorShape).name
86+
var errorShapeType = ctx.symbolProvider.toSymbol(errorShape).name
87+
var errorShapeEnumCase = errorShapeType.decapitalize()
88+
writer.write("case \$S : self = .\$L(try \$L(httpResponse: httpResponse, decoder: decoder, message: message, requestID: requestID, requestID2: requestID2))", errorShapeName, errorShapeEnumCase, errorShapeType)
89+
}
90+
writer.write("default : self = .unknown($unknownServiceErrorType(httpResponse: httpResponse, message: message, requestID: requestID))")
91+
writer.write("}")
92+
writer.dedent()
93+
writer.write("}")
94+
}
95+
96+
writer.openBlock("extension $operationErrorName {", "}") {
97+
writer.openBlock("static func isNotFoundAndEmptyBody(httpResponse: HttpResponse) -> Bool {", "}") {
98+
writer.write("if case .none = httpResponse.body {")
99+
writer.indent()
100+
writer.write("return httpResponse.statusCode == .notFound")
101+
writer.dedent()
102+
writer.write("} else if case .empty = httpResponse.body {")
103+
writer.indent()
104+
writer.write("return httpResponse.statusCode == .notFound")
105+
writer.dedent()
106+
writer.write("}")
107+
writer.write("return false")
108+
}
109+
110+
writer.openBlock("static func constructRestXMLError(httpResponse: HttpResponse) -> AWSClientRuntime.RestXMLError {", "}") {
111+
writer.write("return RestXMLError(errorCode: \"NotFound\", requestId: httpResponse.headers.value(for: \"x-amz-request-id\"))")
112+
}
113+
writer.openBlock("static func getRequestId2(httpResponse: HttpResponse) -> String? {", "}") {
114+
writer.write("return httpResponse.headers.value(for: \"x-amz-id-2\")")
115+
}
116+
}
117+
}
118+
119+
override fun serviceErrorProtocolSymbol(): Symbol? {
120+
return AWSClientRuntimeTypes.RestXML.S3.S3HttpServiceError
121+
}
122+
}

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/ec2query/Ec2QueryProtocolGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ class Ec2QueryProtocolGenerator : AWSHttpBindingProtocolGenerator() {
3939
override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory()
4040
override val httpProtocolCustomizable = AWSHttpProtocolClientCustomizableFactory().constructClientCustomizable(protocol)
4141
override val httpResponseGenerator = HttpResponseGenerator(
42-
serviceErrorProtocolSymbol,
4342
unknownServiceErrorSymbol,
4443
defaultTimestampFormat,
4544
AWSEc2QueryHttpResponseBindingErrorGenerator(),

codegen/smithy-aws-swift-codegen/src/main/kotlin/software/amazon/smithy/aws/swift/codegen/restjson/AWSRestJson1ProtocolGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ class AWSRestJson1ProtocolGenerator : AWSHttpBindingProtocolGenerator() {
2222
override val httpProtocolClientGeneratorFactory = AWSHttpProtocolClientGeneratorFactory()
2323
override val httpProtocolCustomizable = AWSHttpProtocolClientCustomizableFactory().constructClientCustomizable(protocol)
2424
override val httpResponseGenerator = HttpResponseGenerator(
25-
serviceErrorProtocolSymbol,
2625
unknownServiceErrorSymbol,
2726
defaultTimestampFormat,
2827
AWSRestJson1HttpResponseBindingErrorGeneratable()

0 commit comments

Comments
 (0)