@@ -16,22 +16,28 @@ public struct APIGatewayCoder<E, O>: LambdaCoding where E: Codable, E: Sendable,
16
16
let decoder : JSONDecoder
17
17
18
18
/// A closure returning a response body from the given underlying output.
19
- let responseBodyProvider : @Sendable ( O ) -> String ?
19
+ let responseBodyProvider : @Sendable ( O) throws -> String ?
20
+
21
+ /// A closure returns a response body from the given error.
22
+ let errorBodyProvider : @Sendable ( Error) throws -> String ?
20
23
21
24
/// Creates an instance.
22
25
///
23
26
/// - Parameters:
24
27
/// - decoder: A JSON decoder.
25
28
/// - responseBody: A closure returning a response body from the given output.
29
+ /// - errorBody: A closure returning a response body for the given error.
26
30
public init (
27
31
decoder: JSONDecoder = . init( ) ,
28
- responseBody: @escaping @Sendable ( O ) -> String ? = { _ in nil }
32
+ responseBody: @escaping @Sendable ( O) throws -> String ? = { _ in nil } ,
33
+ errorBody: @escaping @Sendable ( Error) throws -> String ? = { $0. localizedDescription }
29
34
) {
30
35
self . decoder = decoder
31
36
self . responseBodyProvider = responseBody
37
+ self . errorBodyProvider = errorBody
32
38
}
33
39
34
- public func decode( event: APIGatewayV2Request ) async throws -> E {
40
+ public func decode( event: APIGatewayV2Request ) throws -> E {
35
41
guard let body = event. body else {
36
42
throw HandlerError . emptyBody
37
43
}
@@ -42,42 +48,20 @@ public struct APIGatewayCoder<E, O>: LambdaCoding where E: Codable, E: Sendable,
42
48
public func encode( output: O ) throws -> APIGatewayV2Response {
43
49
APIGatewayV2Response (
44
50
statusCode: . ok,
45
- body: responseBodyProvider ( output) )
51
+ body: try responseBodyProvider ( output) )
46
52
}
47
53
48
54
public func encode( error: Error ) throws -> APIGatewayV2Response {
55
+ let statusCode : HTTPResponseStatus
49
56
switch error {
50
57
case HandlerError . emptyBody:
51
- return APIGatewayV2Response (
52
- statusCode: . badRequest,
53
- body: errorResponseBody ( error. localizedDescription) )
54
-
55
- case HandlerError . envError:
56
- return APIGatewayV2Response (
57
- statusCode: . internalServerError,
58
- body: errorResponseBody ( error. localizedDescription) )
59
-
60
- case HandlerError . custom( let message) :
61
- return APIGatewayV2Response (
62
- statusCode: . internalServerError,
63
- body: message. flatMap ( errorResponseBody) )
64
-
58
+ statusCode = . badRequest
65
59
default :
66
- return APIGatewayV2Response (
67
- statusCode: . internalServerError,
68
- body: errorResponseBody ( error. localizedDescription) )
60
+ statusCode = . internalServerError
69
61
}
70
- }
71
- }
72
62
73
- private extension APIGatewayCoder {
74
- /// Returns a response body for the given error.
75
- ///
76
- /// - Parameter message: The error message
77
- /// - Returns: The response body.
78
- private func errorResponseBody( _ message: String ) -> String {
79
- """
80
- { " reason " : " \( message) " }
81
- """
63
+ return APIGatewayV2Response (
64
+ statusCode: statusCode,
65
+ body: try errorBodyProvider ( error. localizedDescription) )
82
66
}
83
67
}
0 commit comments