Skip to content

Commit af13f00

Browse files
authored
feat!: Use closures for processing HTTP response (#624)
1 parent 34aecef commit af13f00

File tree

55 files changed

+259
-281
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+259
-281
lines changed

Sources/ClientRuntime/Idempotency/IdempotencyTokenMiddleware.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
// SPDX-License-Identifier: Apache-2.0
66
//
77

8-
public struct IdempotencyTokenMiddleware<OperationStackInput,
9-
OperationStackOutput: HttpResponseBinding,
10-
OperationStackError: HttpResponseErrorBinding>: ClientRuntime.Middleware {
8+
public struct IdempotencyTokenMiddleware<OperationStackInput, OperationStackOutput>: ClientRuntime.Middleware {
119
public let id: Swift.String = "IdempotencyTokenMiddleware"
1210
private let keyPath: WritableKeyPath<OperationStackInput, String?>
1311

Sources/ClientRuntime/Middleware/NoopHandler.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
// SPDX-License-Identifier: Apache-2.0
66
//
77

8-
public struct NoopHandler<Output: HttpResponseBinding>: Handler {
8+
public struct NoopHandler<OperationStackOutput>: Handler {
99
public init() {}
1010

11-
public func handle(context: HttpContext, input: SdkHttpRequest) async throws -> OperationOutput<Output> {
12-
return OperationOutput<Output>(httpResponse: HttpResponse())
11+
public func handle(
12+
context: HttpContext,
13+
input: SdkHttpRequest
14+
) async throws -> OperationOutput<OperationStackOutput> {
15+
return OperationOutput<OperationStackOutput>(httpResponse: HttpResponse())
1316
}
1417
}

Sources/ClientRuntime/Middleware/OperationStack.swift

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0.
33

4-
public struct OperationStack<OperationStackInput,
5-
OperationStackOutput: HttpResponseBinding,
6-
OperationStackError: HttpResponseErrorBinding> {
4+
public struct OperationStack<OperationStackInput, OperationStackOutput> {
75

86
/// returns the unique id for the operation stack as middleware
97
public var id: String
@@ -15,14 +13,11 @@ public struct OperationStack<OperationStackInput,
1513

1614
public init(id: String) {
1715
self.id = id
18-
self.initializeStep = InitializeStep<OperationStackInput,
19-
OperationStackOutput>(id: InitializeStepId)
20-
self.serializeStep = SerializeStep<OperationStackInput,
21-
OperationStackOutput>(id: SerializeStepId)
16+
self.initializeStep = InitializeStep<OperationStackInput, OperationStackOutput>(id: InitializeStepId)
17+
self.serializeStep = SerializeStep<OperationStackInput, OperationStackOutput>(id: SerializeStepId)
2218
self.buildStep = BuildStep<OperationStackOutput>(id: BuildStepId)
2319
self.finalizeStep = FinalizeStep<OperationStackOutput>(id: FinalizeStepId)
2420
self.deserializeStep = DeserializeStep<OperationStackOutput>(id: DeserializeStepId)
25-
2621
}
2722

2823
/// This execute will execute the stack and use your next as the last closure in the chain
@@ -53,6 +48,7 @@ public struct OperationStack<OperationStackInput,
5348
mutating public func presignedRequest<H: Handler>(
5449
context: HttpContext,
5550
input: OperationStackInput,
51+
output: OperationStackOutput,
5652
next: H
5753
) async throws -> SdkHttpRequestBuilder? where
5854
H.Input == SdkHttpRequest,
@@ -61,9 +57,9 @@ public struct OperationStack<OperationStackInput,
6157
var builder: SdkHttpRequestBuilder?
6258
self.finalizeStep.intercept(
6359
position: .after,
64-
middleware: PresignerShim<OperationStackOutput, OperationStackError>(handler: { buildInMiddleware in
60+
middleware: PresignerShim<OperationStackOutput>(handler: { buildInMiddleware in
6561
builder = buildInMiddleware
66-
}))
62+
}, output: output))
6763
_ = try await handleMiddleware(context: context, input: input, next: next)
6864
return builder
6965
}

Sources/ClientRuntime/Middleware/PresignerShimHandler.swift

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77

88
typealias PresignerShimHandler = (SdkHttpRequestBuilder) -> Void
99

10-
struct PresignerShim<OperationStackOutput: HttpResponseBinding,
11-
OperationStackError: HttpResponseErrorBinding>: Middleware {
10+
struct PresignerShim<OperationStackOutput>: Middleware {
1211
public let id: String = "PresignerShim"
1312

1413
private let handler: PresignerShimHandler
14+
private let output: OperationStackOutput
1515

16-
init(handler: @escaping PresignerShimHandler) {
16+
init(handler: @escaping PresignerShimHandler, output: OperationStackOutput) {
1717
self.handler = handler
18+
self.output = output
1819
}
1920

2021
public typealias MInput = SdkHttpRequestBuilder
2122
public typealias MOutput = OperationOutput<OperationStackOutput>
2223
public typealias Context = HttpContext
23-
public typealias MError = OperationStackError
2424

2525
public func handle<H>(context: HttpContext,
2626
input: SdkHttpRequestBuilder,
@@ -31,13 +31,6 @@ struct PresignerShim<OperationStackOutput: HttpResponseBinding,
3131
Self.MOutput == H.Output {
3232
handler(input)
3333
let httpResponse = HttpResponse(body: .none, statusCode: .ok)
34-
do {
35-
let output: OperationStackOutput? = try await OperationStackOutput(
36-
httpResponse: httpResponse,
37-
decoder: nil)
38-
return .init(httpResponse: httpResponse, output: output)
39-
} catch {
40-
throw ClientError.unknownError("PresignerShimHandler: This code should not execute")
41-
}
34+
return .init(httpResponse: httpResponse, output: output)
4235
}
4336
}

Sources/ClientRuntime/Middleware/RetryMiddleware.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
// SPDX-License-Identifier: Apache-2.0
66
//
77

8-
public struct RetryMiddleware<Strategy: RetryStrategy, ErrorInfoProvider: RetryErrorInfoProvider,
9-
Output: HttpResponseBinding, OutputError: HttpResponseErrorBinding>: Middleware {
8+
public struct RetryMiddleware<Strategy: RetryStrategy,
9+
ErrorInfoProvider: RetryErrorInfoProvider,
10+
OperationStackOutput>: Middleware {
1011

1112
public typealias MInput = SdkHttpRequestBuilder
12-
public typealias MOutput = OperationOutput<Output>
13+
public typealias MOutput = OperationOutput<OperationStackOutput>
1314
public typealias Context = HttpContext
1415

1516
public var id: String { "Retry" }
@@ -20,15 +21,17 @@ public struct RetryMiddleware<Strategy: RetryStrategy, ErrorInfoProvider: RetryE
2021
}
2122

2223
public func handle<H>(context: Context, input: SdkHttpRequestBuilder, next: H) async throws ->
23-
OperationOutput<Output> where H: Handler, MInput == H.Input, MOutput == H.Output, Context == H.Context {
24+
OperationOutput<OperationStackOutput>
25+
where H: Handler, MInput == H.Input, MOutput == H.Output, Context == H.Context {
2426

2527
let partitionID = try getPartitionID(context: context, input: input)
2628
let token = try await strategy.acquireInitialRetryToken(tokenScope: partitionID)
2729
return try await sendRequest(token: token, context: context, input: input, next: next)
2830
}
2931

3032
private func sendRequest<H>(token: Strategy.Token, context: Context, input: MInput, next: H) async throws ->
31-
OperationOutput<Output> where H: Handler, MInput == H.Input, MOutput == H.Output, Context == H.Context {
33+
OperationOutput<OperationStackOutput>
34+
where H: Handler, MInput == H.Input, MOutput == H.Output, Context == H.Context {
3235

3336
do {
3437
let serviceResponse = try await next.handle(context: context, input: input)

Sources/ClientRuntime/Middleware/Steps/BuildStep.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@
88
/// Takes Request, and returns result or error.
99
///
1010
/// Receives result or error from Finalize step.
11-
public typealias BuildStep<O: HttpResponseBinding> = MiddlewareStep<HttpContext,
12-
SdkHttpRequestBuilder,
13-
OperationOutput<O>>
11+
public typealias BuildStep<OperationStackOutput> = MiddlewareStep<HttpContext,
12+
SdkHttpRequestBuilder,
13+
OperationOutput<OperationStackOutput>>
1414

1515
public let BuildStepId = "Build"
1616

17-
public struct BuildStepHandler<OperationStackOutput: HttpResponseBinding,
18-
H: Handler>: Handler where H.Context == HttpContext,
19-
H.Input == SdkHttpRequestBuilder,
20-
H.Output == OperationOutput<OperationStackOutput> {
17+
public struct BuildStepHandler<OperationStackOutput, H: Handler>: Handler
18+
where H.Context == HttpContext,
19+
H.Input == SdkHttpRequestBuilder,
20+
H.Output == OperationOutput<OperationStackOutput> {
2121

2222
public typealias Input = SdkHttpRequestBuilder
2323

Sources/ClientRuntime/Middleware/Steps/DeserializeStep.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010
/// Takes Request, and returns result or error.
1111
///
1212
/// Receives raw response, or error from underlying handler.
13-
public typealias DeserializeStep<O: HttpResponseBinding> = MiddlewareStep<HttpContext,
14-
SdkHttpRequest,
15-
OperationOutput<O>>
13+
public typealias DeserializeStep<OperationStackOutput> = MiddlewareStep<HttpContext,
14+
SdkHttpRequest,
15+
OperationOutput<OperationStackOutput>>
1616

1717
public let DeserializeStepId = "Deserialize"
1818

19-
public struct DeserializeStepHandler<OperationStackOutput: HttpResponseBinding,
20-
H: Handler>: Handler where H.Context == HttpContext,
21-
H.Input == SdkHttpRequest,
22-
H.Output == OperationOutput<OperationStackOutput> {
19+
public struct DeserializeStepHandler<OperationStackOutput, H: Handler>: Handler
20+
where H.Context == HttpContext,
21+
H.Input == SdkHttpRequest,
22+
H.Output == OperationOutput<OperationStackOutput> {
2323

2424
public typealias Input = SdkHttpRequest
2525

@@ -36,7 +36,7 @@ public struct DeserializeStepHandler<OperationStackOutput: HttpResponseBinding,
3636
}
3737
}
3838

39-
public struct OperationOutput<Output: HttpResponseBinding> {
39+
public struct OperationOutput<Output> {
4040
public var httpResponse: HttpResponse
4141
public var output: Output?
4242

Sources/ClientRuntime/Middleware/Steps/FinalizeStep.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,16 @@
99
// Takes Request, and returns result or error.
1010
//
1111
// Receives result or error from Deserialize step.
12-
public typealias FinalizeStep<O: HttpResponseBinding> = MiddlewareStep<HttpContext,
13-
SdkHttpRequestBuilder,
14-
OperationOutput<O>>
12+
public typealias FinalizeStep<OperationStackOutput> = MiddlewareStep<HttpContext,
13+
SdkHttpRequestBuilder,
14+
OperationOutput<OperationStackOutput>>
1515

1616
public let FinalizeStepId = "Finalize"
1717

18-
public struct FinalizeStepHandler<OperationStackOutput: HttpResponseBinding,
19-
H: Handler>: Handler where H.Context == HttpContext,
20-
H.Input == SdkHttpRequest,
21-
H.Output == OperationOutput<OperationStackOutput> {
18+
public struct FinalizeStepHandler<OperationStackOutput, H: Handler>: Handler
19+
where H.Context == HttpContext,
20+
H.Input == SdkHttpRequest,
21+
H.Output == OperationOutput<OperationStackOutput> {
2222

2323
public typealias Input = SdkHttpRequestBuilder
2424

Sources/ClientRuntime/Middleware/Steps/InitializeStep.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,15 @@
77
/// Takes Input Parameters, and returns result or error.
88
///
99
/// Receives result or error from Serialize step.
10-
public typealias InitializeStep<I,
11-
O: HttpResponseBinding> = MiddlewareStep<HttpContext,
12-
I,
13-
OperationOutput<O>>
10+
public typealias InitializeStep<OperationStackInput, OperationStackOutput> =
11+
MiddlewareStep<HttpContext, OperationStackInput, OperationOutput<OperationStackOutput>>
1412

1513
public let InitializeStepId = "Initialize"
1614

17-
public struct InitializeStepHandler<OperationStackInput,
18-
OperationStackOutput: HttpResponseBinding,
19-
H: Handler>: Handler where H.Context == HttpContext,
20-
H.Input == SerializeStepInput<OperationStackInput>,
21-
H.Output == OperationOutput<OperationStackOutput> {
15+
public struct InitializeStepHandler<OperationStackInput, OperationStackOutput, H: Handler>: Handler
16+
where H.Context == HttpContext,
17+
H.Input == SerializeStepInput<OperationStackInput>,
18+
H.Output == OperationOutput<OperationStackOutput> {
2219

2320
public typealias Input = OperationStackInput
2421

Sources/ClientRuntime/Middleware/Steps/SerializeStep.swift

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,15 @@
77
/// Converts Input Parameters into a Request, and returns the result or error.
88
///
99
/// Receives result or error from Build step.
10-
public typealias SerializeStep<I,
11-
O: HttpResponseBinding> = MiddlewareStep<HttpContext,
12-
SerializeStepInput<I>,
13-
OperationOutput<O>>
10+
public typealias SerializeStep<OperationStackInput, OperationStackOutput> =
11+
MiddlewareStep<HttpContext, SerializeStepInput<OperationStackInput>, OperationOutput<OperationStackOutput>>
1412

1513
public let SerializeStepId = "Serialize"
1614

17-
public struct SerializeStepHandler<OperationStackInput,
18-
OperationStackOutput: HttpResponseBinding,
19-
H: Handler>: Handler where H.Context == HttpContext,
20-
H.Input == SdkHttpRequestBuilder,
21-
H.Output == OperationOutput<OperationStackOutput> {
15+
public struct SerializeStepHandler<OperationStackInput, OperationStackOutput, H: Handler>: Handler
16+
where H.Context == HttpContext,
17+
H.Input == SdkHttpRequestBuilder,
18+
H.Output == OperationOutput<OperationStackOutput> {
2219

2320
public typealias Input = SerializeStepInput<OperationStackInput>
2421

0 commit comments

Comments
 (0)