@@ -16,22 +16,28 @@ public struct APIGatewayCoder<E, O>: LambdaCoding where E: Codable, E: Sendable,
1616 let decoder : JSONDecoder
1717
1818 /// 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 ?
2023
2124 /// Creates an instance.
2225 ///
2326 /// - Parameters:
2427 /// - decoder: A JSON decoder.
2528 /// - responseBody: A closure returning a response body from the given output.
29+ /// - errorBody: A closure returning a response body for the given error.
2630 public init (
2731 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 }
2934 ) {
3035 self . decoder = decoder
3136 self . responseBodyProvider = responseBody
37+ self . errorBodyProvider = errorBody
3238 }
3339
34- public func decode( event: APIGatewayV2Request ) async throws -> E {
40+ public func decode( event: APIGatewayV2Request ) throws -> E {
3541 guard let body = event. body else {
3642 throw HandlerError . emptyBody
3743 }
@@ -42,42 +48,20 @@ public struct APIGatewayCoder<E, O>: LambdaCoding where E: Codable, E: Sendable,
4248 public func encode( output: O ) throws -> APIGatewayV2Response {
4349 APIGatewayV2Response (
4450 statusCode: . ok,
45- body: responseBodyProvider ( output) )
51+ body: try responseBodyProvider ( output) )
4652 }
4753
4854 public func encode( error: Error ) throws -> APIGatewayV2Response {
55+ let statusCode : HTTPResponseStatus
4956 switch error {
5057 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
6559 default :
66- return APIGatewayV2Response (
67- statusCode: . internalServerError,
68- body: errorResponseBody ( error. localizedDescription) )
60+ statusCode = . internalServerError
6961 }
70- }
71- }
7262
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) )
8266 }
8367}
0 commit comments