Skip to content
This repository was archived by the owner on Mar 19, 2024. It is now read-only.

Commit 42a17b0

Browse files
Fix Documentation and README for S3Test and HTTPSRequest
1 parent 3257df2 commit 42a17b0

File tree

4 files changed

+86
-60
lines changed

4 files changed

+86
-60
lines changed

Examples/HTTPSRequest/README.md

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,14 @@ Define an Event and a Response as Codable.
1010
```swift
1111
import AsyncHTTPClient
1212
import Foundation
13+
#if canImport(FoundationNetworking)
14+
import FoundationNetworking
15+
#endif
1316
import LambdaSwiftSprinter
1417
import LambdaSwiftSprinterNioPlugin
1518
import Logging
19+
import NIO
20+
import NIOFoundationCompat
1621

1722
struct Event: Codable {
1823
let url: String
@@ -24,35 +29,27 @@ struct Response: Codable {
2429
}
2530
```
2631

27-
Use this code to allow the conversion of a `ByteBuffer` to `Data`
28-
```swift
29-
extension Array where Element == UInt8 {
30-
var data: Data {
31-
return Data(self)
32-
}
33-
}
34-
```
35-
3632
Add a loger:
3733
```swift
3834
let logger = Logger(label: "AWS.Lambda.HTTPSRequest")
3935
```
4036

4137
Define the lambda:
4238
```swift
43-
let lambda: SyncCodableLambda<Event, Response> = { (input, context) throws -> Response in
44-
45-
let request = try HTTPClient.Request(url: input.url)
46-
let response = try httpClient.execute(request: request).wait()
47-
48-
guard let body = response.body,
49-
let buffer = body.getBytes(at: 0, length: body.readableBytes) else {
50-
throw SprinterError.invalidJSON
51-
}
52-
let data = Data(buffer)
53-
let content = String(data: data, encoding: .utf8) ?? ""
54-
55-
return Response(url: input.url, content: content)
39+
let syncCodableNIOLambda: SyncCodableNIOLambda<Event, Response> = { (event, context) throws -> EventLoopFuture<Response> in
40+
41+
let request = try HTTPClient.Request(url: event.url)
42+
let future = httpClient.execute(request: request, deadline: nil)
43+
.flatMapThrowing { (response) throws -> String in
44+
guard let body = response.body,
45+
let value = body.getString(at: 0, length: body.readableBytes) else {
46+
throw SprinterError.invalidJSON
47+
}
48+
return value
49+
}.map { content -> Response in
50+
return Response(url: event.url, content: content)
51+
}
52+
return future
5653
}
5754
```
5855

@@ -64,10 +61,11 @@ Then use this boilerplate code to run the lambda:
6461
```swift
6562
do {
6663
let sprinter = try SprinterNIO()
67-
sprinter.register(handler: "getHttps", lambda: lambda)
64+
sprinter.register(handler: "getHttps", lambda: syncCodableNIOLambda)
65+
6866
try sprinter.run()
6967
} catch {
70-
logger.error(String(describing: error))
68+
logger.error("\(String(describing: error))")
7169
}
7270
```
7371

Examples/HTTPSRequest/Sources/HTTPSRequest/main.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ let asyncCodableNIOLambda: AsyncCodableNIOLambda<Event, Response> = { (event, co
170170
}
171171

172172
/**
173-
Deprecated style of implementing the lambda using the NIO plugin.
173+
Deprecated style of implementing the lambda using the core framework.
174174

175175
- The example has been left to keep the compatibility with the tutorial:
176176

@@ -201,6 +201,8 @@ let lambda: SyncCodableLambda<Event, Response> = { (input, context) throws -> Re
201201
return Response(url: input.url, content: content)
202202
}
203203

204+
205+
/// The following code it's required to setup, register, run the lambda and log errors.
204206
do {
205207
let sprinter = try SprinterNIO()
206208
//Note amend this line in case if it's required to use a different lambda handler.

Examples/S3Test/README.md

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,14 @@ To launch this code you need:
1717
Define an Event and a Response as Codable.
1818
```swift
1919
import Foundation
20-
import LambdaSwiftSprinter
20+
#if canImport(FoundationNetworking)
21+
import FoundationNetworking
22+
#endif
23+
import LambdaSwiftSprinterNioPlugin
2124
import Logging
2225
import S3
26+
import NIO
27+
import NIOFoundationCompat
2328

2429
struct Bucket: Codable {
2530
let name: String
@@ -44,22 +49,20 @@ let logger = Logger(label: "AWS.Lambda.HTTPSRequest")
4449

4550
define the lambda:
4651
```swift
47-
let getObject: AsyncCodableLambda<Bucket, Response> = { event, _, completion in
48-
52+
let getObject: SyncCodableNIOLambda<Bucket, Response> = { (event, context) throws -> EventLoopFuture<Response> in
53+
4954
let getObjectRequest = S3.GetObjectRequest(bucket: event.name, key: event.key)
50-
do {
51-
let response = try s3.getObject(getObjectRequest).wait()
52-
53-
guard let body = response.body else {
54-
logger.info("Body is empty")
55-
completion(.success(Response(value: "")))
56-
return
55+
let future = s3.getObject(getObjectRequest)
56+
.flatMapThrowing { (response) throws -> String in
57+
guard let body = response.body,
58+
let value = String(data: body, encoding: .utf8) else {
59+
return ""
60+
}
61+
return value
62+
}.map { content -> Response in
63+
return Response(value: content)
5764
}
58-
let value = String(data: body, encoding: .utf8)
59-
completion(.success(Response(value: value)))
60-
} catch {
61-
completion(.failure(error))
62-
}
65+
return future
6366
}
6467
```
6568

@@ -70,13 +73,12 @@ This lambda is synchronous, meaning that all the operation are performed on the
7073
Then use this boilerplate code to run the lambda:
7174
```swift
7275
do {
73-
let sprinter = try SprinterCURL()
76+
let sprinter = try SprinterNIO()
7477
sprinter.register(handler: "getObject", lambda: getObject)
7578
try sprinter.run()
7679
} catch {
77-
logger.error("error: \(error)")
80+
logger.error("\(String(describing: error))")
7881
}
79-
8082
```
8183

8284
This will initialize the Sprinter with a Sprinter based on NIO 2 library.

Examples/S3Test/Sources/S3Test/main.swift

Lines changed: 41 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ let s3 = S3(region: .useast1)
3535

3636
let logger = Logger(label: "AWS.Lambda.S3Test")
3737

38+
/**
39+
How to use the `SyncCodableNIOLambda<Bucket, Response>` lambda handler with S3.
40+
41+
- The code is used by this example.
42+
- Make sure the handler is registered:
43+
44+
```
45+
sprinter.register(handler: "getObject", lambda: getObject)
46+
```
47+
*/
3848
let getObject: SyncCodableNIOLambda<Bucket, Response> = { (event, context) throws -> EventLoopFuture<Response> in
3949

4050
let getObjectRequest = S3.GetObjectRequest(bucket: event.name, key: event.key)
@@ -51,24 +61,38 @@ let getObject: SyncCodableNIOLambda<Bucket, Response> = { (event, context) throw
5161
return future
5262
}
5363

54-
//let getObject: AsyncCodableNIOLambda<Bucket, Response> = { event, _, completion in
55-
//
56-
// let getObjectRequest = S3.GetObjectRequest(bucket: event.name, key: event.key)
57-
// do {
58-
// let response = try s3.getObject(getObjectRequest).wait()
59-
//
60-
// guard let body = response.body else {
61-
// logger.info("Body is empty")
62-
// completion(.success(Response(value: "")))
63-
// return
64-
// }
65-
// let value = String(data: body, encoding: .utf8)
66-
// completion(.success(Response(value: value)))
67-
// } catch {
68-
// completion(.failure(error))
69-
// }
70-
//}
64+
/**
65+
How to use the `AsyncCodableNIOLambda<Bucket, Response>` lambda handler with S3.
66+
67+
- The code is unused.
68+
- Make sure the handler is registered.
69+
- If it's required by the lambda implementation, amend the following lines:
70+
71+
```
72+
//sprinter.register(handler: "getObject", lambda: getObject)
73+
sprinter.register(handler: "getObjectAsync", lambda: getObjectAsync)
74+
75+
```
76+
*/
77+
let getObjectAsync: AsyncCodableNIOLambda<Bucket, Response> = { event, _, completion in
78+
79+
let getObjectRequest = S3.GetObjectRequest(bucket: event.name, key: event.key)
80+
do {
81+
let response = try s3.getObject(getObjectRequest).wait()
82+
83+
guard let body = response.body else {
84+
logger.info("Body is empty")
85+
completion(.success(Response(value: "")))
86+
return
87+
}
88+
let value = String(data: body, encoding: .utf8)
89+
completion(.success(Response(value: value)))
90+
} catch {
91+
completion(.failure(error))
92+
}
93+
}
7194

95+
/// The following code it's required to setup, register, run the lambda and log errors.
7296
do {
7397
let sprinter = try SprinterNIO()
7498
sprinter.register(handler: "getObject", lambda: getObject)

0 commit comments

Comments
 (0)