@@ -29,17 +29,20 @@ package protocol LambdaEventDecoder {
29
29
/// The protocol an encoder must conform to so that it can be used with ``LambdaCodableAdapter`` to encode the generic
30
30
/// ``Output`` object into a ``ByteBuffer``.
31
31
package protocol LambdaOutputEncoder {
32
+ associatedtype Output
33
+
32
34
/// Encode the generic type `Output` the handler has returned into a ``ByteBuffer``.
33
35
/// - Parameters:
34
36
/// - value: The object to encode into a ``ByteBuffer``.
35
37
/// - buffer: The ``ByteBuffer`` where the encoded value will be written to.
36
- func encode< Output : Encodable > ( _ value: Output , into buffer: inout ByteBuffer ) throws
38
+ func encode( _ value: Output , into buffer: inout ByteBuffer ) throws
37
39
}
38
40
39
41
package struct VoidEncoder : LambdaOutputEncoder {
40
- package func encode < Output> ( _ value : Output , into buffer : inout NIOCore . ByteBuffer ) throws where Output : Encodable {
42
+ package typealias Output = Void
41
43
42
- }
44
+ @inlinable
45
+ package func encode( _ value: Void , into buffer: inout NIOCore . ByteBuffer ) throws { }
43
46
}
44
47
45
48
/// Adapts a ``NewLambdaHandler`` conforming handler to conform to ``LambdaWithBackgroundProcessingHandler``.
@@ -48,10 +51,11 @@ package struct LambdaHandlerAdapter<
48
51
Output,
49
52
Handler: NewLambdaHandler
50
53
> : LambdaWithBackgroundProcessingHandler where Handler. Event == Event , Handler. Output == Output {
51
- let handler : Handler
54
+ @ usableFromInline let handler : Handler
52
55
53
56
/// Initializes an instance given a concrete handler.
54
57
/// - Parameter handler: The ``NewLambdaHandler`` conforming handler that is to be adapted to ``LambdaWithBackgroundProcessingHandler``.
58
+ @inlinable
55
59
package init ( handler: Handler ) {
56
60
self . handler = handler
57
61
}
@@ -62,9 +66,10 @@ package struct LambdaHandlerAdapter<
62
66
/// - event: The received event.
63
67
/// - outputWriter: The writer to write the computed response to.
64
68
/// - context: The ``NewLambdaContext`` containing the invocation's metadata.
69
+ @inlinable
65
70
package func handle(
66
71
_ event: Event ,
67
- outputWriter: consuming some LambdaResponseWriter < Output > ,
72
+ outputWriter: some LambdaResponseWriter < Output > ,
68
73
context: NewLambdaContext
69
74
) async throws {
70
75
let output = try await self . handler. handle ( event, context: context)
@@ -79,17 +84,18 @@ package struct LambdaCodableAdapter<
79
84
Output,
80
85
Decoder: LambdaEventDecoder ,
81
86
Encoder: LambdaOutputEncoder
82
- > : StreamingLambdaHandler where Handler. Event == Event , Handler. Output == Output {
83
- let handler : Handler
84
- let encoder : Encoder
85
- let decoder : Decoder
86
- private var byteBuffer : ByteBuffer = . init( )
87
+ > : StreamingLambdaHandler where Handler. Event == Event , Handler. Output == Output , Encoder . Output == Output {
88
+ @ usableFromInline let handler : Handler
89
+ @ usableFromInline let encoder : Encoder
90
+ @ usableFromInline let decoder : Decoder
91
+ /* private*/ @ usableFromInline var byteBuffer : ByteBuffer = . init( )
87
92
88
93
/// Initializes an instance given an encoder, decoder, and a handler with a non-`Void` output.
89
94
/// - Parameters:
90
95
/// - encoder: The encoder object that will be used to encode the generic ``Output`` obtained from the `handler`'s `outputWriter` into a ``ByteBuffer``.
91
96
/// - decoder: The decoder object that will be used to decode the received ``ByteBuffer`` event into the generic ``Event`` type served to the `handler`.
92
97
/// - handler: The handler object.
98
+ @inlinable
93
99
package init ( encoder: Encoder , decoder: Decoder , handler: Handler ) where Output: Encodable {
94
100
self . encoder = encoder
95
101
self . decoder = decoder
@@ -100,6 +106,7 @@ package struct LambdaCodableAdapter<
100
106
/// - Parameters:
101
107
/// - decoder: The decoder object that will be used to decode the received ``ByteBuffer`` event into the generic ``Event`` type served to the `handler`.
102
108
/// - handler: The handler object.
109
+ @inlinable
103
110
package init ( decoder: Decoder , handler: Handler ) where Output == Void , Encoder == VoidEncoder {
104
111
self . encoder = VoidEncoder ( )
105
112
self . decoder = decoder
@@ -111,43 +118,43 @@ package struct LambdaCodableAdapter<
111
118
/// - event: The received event.
112
119
/// - outputWriter: The writer to write the computed response to.
113
120
/// - context: The ``NewLambdaContext`` containing the invocation's metadata.
114
- package mutating func handle(
121
+ @inlinable
122
+ package mutating func handle< Writer: LambdaResponseStreamWriter > (
115
123
_ request: ByteBuffer ,
116
- responseWriter: some LambdaResponseStreamWriter ,
124
+ responseWriter: Writer ,
117
125
context: NewLambdaContext
118
126
) async throws {
119
127
let event = try self . decoder. decode ( Event . self, from: request)
120
128
121
- let writer = LambdaCodableResponseWriter < Output > ( encoder: self . encoder, streamWriter: responseWriter)
129
+ let writer = LambdaCodableResponseWriter < Output , Encoder , Writer > (
130
+ encoder: self . encoder,
131
+ streamWriter: responseWriter
132
+ )
122
133
try await self . handler. handle ( event, outputWriter: writer, context: context)
123
134
}
124
135
}
125
136
126
137
/// A ``LambdaResponseStreamWriter`` wrapper that conforms to ``LambdaResponseWriter``.
127
- package struct LambdaCodableResponseWriter < Output> : LambdaResponseWriter {
128
- @usableFromInline let underlyingStreamWriter : LambdaResponseStreamWriter
129
- @usableFromInline let encoder : LambdaOutputEncoder
138
+ package struct LambdaCodableResponseWriter < Output, Encoder: LambdaOutputEncoder , Base: LambdaResponseStreamWriter > :
139
+ LambdaResponseWriter
140
+ where Output == Encoder . Output {
141
+ @usableFromInline let underlyingStreamWriter : Base
142
+ @usableFromInline let encoder : Encoder
130
143
131
144
/// Initializes an instance given an encoder and an underlying ``LambdaResponseStreamWriter``.
132
145
/// - Parameters:
133
146
/// - encoder: The encoder object that will be used to encode the generic ``Output`` into a ``ByteBuffer``, which will then be passed to `streamWriter`.
134
147
/// - streamWriter: The underlying ``LambdaResponseStreamWriter`` that will be wrapped.
135
148
@inlinable
136
- package init ( encoder: LambdaOutputEncoder , streamWriter: LambdaResponseStreamWriter ) {
149
+ package init ( encoder: Encoder , streamWriter: Base ) {
137
150
self . encoder = encoder
138
151
self . underlyingStreamWriter = streamWriter
139
152
}
140
153
141
- /// Passes the `output` argument to ``LambdaResponseStreamWriter/writeAndFinish(_:)``.
142
- /// - Parameter output: The generic ``Output`` object that will be passed to ``LambdaResponseStreamWriter/writeAndFinish(_:)``.
143
154
@inlinable
144
155
package func write( _ output: Output ) async throws {
145
- if Output . self == Void . self {
146
- try await self . underlyingStreamWriter. finish ( )
147
- } else if let output = output as? Encodable {
148
- var outputBuffer = ByteBuffer ( )
149
- try self . encoder. encode ( output, into: & outputBuffer)
150
- try await self . underlyingStreamWriter. writeAndFinish ( outputBuffer)
151
- }
156
+ var outputBuffer = ByteBuffer ( )
157
+ try self . encoder. encode ( output, into: & outputBuffer)
158
+ try await self . underlyingStreamWriter. writeAndFinish ( outputBuffer)
152
159
}
153
160
}
0 commit comments