Skip to content

Commit a7329a4

Browse files
authored
Improvements in event compilation (#659)
* Make compiling chrono conditional It's not necessary for all event types. Signed-off-by: David Calavera <david.calavera@gmail.com> * Make compiling query_map conditional. It's not used in all events. Signed-off-by: David Calavera <david.calavera@gmail.com> * Test individual features - Convert package to 2021 edition. - Format imports. Signed-off-by: David Calavera <david.calavera@gmail.com> * Remove old idioms So people don't have to learn 2015 idioms like `extern crate` and implicit macro imports. Signed-off-by: David Calavera <david.calavera@gmail.com> * Bump crate version Signed-off-by: David Calavera <david.calavera@gmail.com> --------- Signed-off-by: David Calavera <david.calavera@gmail.com>
1 parent 007f915 commit a7329a4

File tree

70 files changed

+653
-560
lines changed

Some content is hidden

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

70 files changed

+653
-560
lines changed

.github/workflows/build-events.yml

+9
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,12 @@ jobs:
2626
with:
2727
package: aws_lambda_events
2828
toolchain: ${{ matrix.toolchain}}
29+
check-event-features:
30+
runs-on: ubuntu-latest
31+
steps:
32+
- uses: actions/checkout@v3
33+
- uses: dtolnay/rust-toolchain@stable
34+
- uses: Swatinem/rust-cache@v2
35+
36+
- name: Test individual event features
37+
run: make check-event-features

Makefile

+44
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,47 @@ invoke-integration-api-%:
6060
curl -X POST -d '{"command": "hello"}' $(API_URL)/trait/post
6161
curl -X POST -d '{"command": "hello"}' $(API_URL)/al2/post
6262
curl -X POST -d '{"command": "hello"}' $(API_URL)/al2-trait/post
63+
64+
# Test individual event features to ensure optional dependencies
65+
# are correctly loaded when all default features are disabled.
66+
check-event-features:
67+
cargo test --package aws_lambda_events --no-default-features --features activemq
68+
cargo test --package aws_lambda_events --no-default-features --features alb
69+
cargo test --package aws_lambda_events --no-default-features --features apigw
70+
cargo test --package aws_lambda_events --no-default-features --features appsync
71+
cargo test --package aws_lambda_events --no-default-features --features autoscaling
72+
cargo test --package aws_lambda_events --no-default-features --features chime_bot
73+
cargo test --package aws_lambda_events --no-default-features --features clientvpn
74+
cargo test --package aws_lambda_events --no-default-features --features cloudwatch_events
75+
cargo test --package aws_lambda_events --no-default-features --features cloudwatch_logs
76+
cargo test --package aws_lambda_events --no-default-features --features code_commit
77+
cargo test --package aws_lambda_events --no-default-features --features codebuild
78+
cargo test --package aws_lambda_events --no-default-features --features codedeploy
79+
cargo test --package aws_lambda_events --no-default-features --features codepipeline_cloudwatch
80+
cargo test --package aws_lambda_events --no-default-features --features codepipeline_job
81+
cargo test --package aws_lambda_events --no-default-features --features cognito
82+
cargo test --package aws_lambda_events --no-default-features --features config
83+
cargo test --package aws_lambda_events --no-default-features --features connect
84+
cargo test --package aws_lambda_events --no-default-features --features dynamodb
85+
cargo test --package aws_lambda_events --no-default-features --features ecr_scan
86+
cargo test --package aws_lambda_events --no-default-features --features firehose
87+
cargo test --package aws_lambda_events --no-default-features --features iam
88+
cargo test --package aws_lambda_events --no-default-features --features iot
89+
cargo test --package aws_lambda_events --no-default-features --features iot_1_click
90+
cargo test --package aws_lambda_events --no-default-features --features iot_button
91+
cargo test --package aws_lambda_events --no-default-features --features iot_deprecated
92+
cargo test --package aws_lambda_events --no-default-features --features kafka
93+
cargo test --package aws_lambda_events --no-default-features --features kinesis
94+
cargo test --package aws_lambda_events --no-default-features --features kinesis_analytics
95+
cargo test --package aws_lambda_events --no-default-features --features lambda_function_urls
96+
cargo test --package aws_lambda_events --no-default-features --features lex
97+
cargo test --package aws_lambda_events --no-default-features --features rabbitmq
98+
cargo test --package aws_lambda_events --no-default-features --features s3
99+
cargo test --package aws_lambda_events --no-default-features --features s3_batch_job
100+
cargo test --package aws_lambda_events --no-default-features --features ses
101+
cargo test --package aws_lambda_events --no-default-features --features sns
102+
cargo test --package aws_lambda_events --no-default-features --features sqs
103+
cargo test --package aws_lambda_events --no-default-features --features streams
104+
105+
fmt:
106+
cargo +nightly fmt --all

lambda-events/Cargo.toml

+27-30
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "aws_lambda_events"
3-
version = "0.9.0"
3+
version = "0.10.0"
44
description = "AWS Lambda event definitions"
55
authors = [
66
"Christian Legnitto <christian@legnitto.com>",
@@ -13,29 +13,26 @@ repository = "https://github.com/awslabs/aws-lambda-rust-runtime"
1313
readme = "README.md"
1414
keywords = ["lambda", "aws", "amazon", "events", "S3"]
1515
categories = ["api-bindings", "encoding", "web-programming"]
16+
edition = "2021"
1617

1718
[dependencies]
1819
base64 = "0.21"
19-
http = "0.2"
20-
http-body = "0.4"
21-
http-serde = "^1"
22-
serde = "^1"
23-
serde_derive = "^1"
20+
http = { version = "0.2", optional = true }
21+
http-body = { version = "0.4", optional = true }
22+
http-serde = { version = "^1", optional = true }
23+
serde = { version = "^1", features = ["derive"] }
2424
serde_with = { version = "^3", features = ["json"], optional = true }
2525
serde_json = "^1"
2626
serde_dynamo = { version = "^4.1", optional = true }
27-
bytes = { version = "1", features = ["serde"] }
27+
bytes = { version = "1", features = ["serde"], optional = true }
2828
chrono = { version = "0.4.23", default-features = false, features = [
2929
"clock",
3030
"serde",
3131
"std",
32-
] }
33-
query_map = { version = "^0.6", features = ["serde", "url-query"] }
32+
], optional = true }
33+
query_map = { version = "^0.6", features = ["serde", "url-query"], optional = true }
3434
flate2 = { version = "1.0.24", optional = true }
3535

36-
[dev-dependencies]
37-
pretty_assertions = "1.3"
38-
3936
[features]
4037
default = [
4138
"activemq",
@@ -78,40 +75,40 @@ default = [
7875
]
7976

8077
activemq = []
81-
alb = []
82-
apigw = []
78+
alb = ["bytes", "http", "http-body", "http-serde", "query_map"]
79+
apigw = ["bytes", "http", "http-body", "http-serde", "query_map"]
8380
appsync = []
84-
autoscaling = []
85-
chime_bot = []
81+
autoscaling = ["chrono"]
82+
chime_bot = ["chrono"]
8683
clientvpn = []
87-
cloudwatch_events = []
84+
cloudwatch_events = ["chrono"]
8885
cloudwatch_logs = ["flate2"]
89-
code_commit = []
90-
codebuild = []
91-
codedeploy = []
86+
code_commit = ["chrono"]
87+
codebuild = ["chrono"]
88+
codedeploy = ["chrono"]
9289
codepipeline = []
93-
codepipeline_cloudwatch = []
90+
codepipeline_cloudwatch = ["chrono"]
9491
codepipeline_job = []
9592
cognito = []
9693
config = []
9794
connect = []
98-
dynamodb = ["streams", "serde_dynamo"]
95+
dynamodb = ["chrono", "serde_dynamo", "streams"]
9996
ecr_scan = []
100-
firehose = []
97+
firehose = ["chrono"]
10198
iam = []
102-
iot = ["iam"]
99+
iot = ["bytes", "http", "http-body", "http-serde", "iam"]
103100
iot_1_click = []
104101
iot_button = []
105102
iot_deprecated = ["iot"]
106-
kafka = []
107-
kinesis = []
103+
kafka = ["chrono"]
104+
kinesis = ["chrono"]
108105
kinesis_analytics = ["kinesis"]
109-
lambda_function_urls = []
106+
lambda_function_urls = ["bytes", "http", "http-body", "http-serde"]
110107
lex = []
111108
rabbitmq = []
112-
s3 = []
109+
s3 = ["bytes", "chrono", "http", "http-body", "http-serde"]
113110
s3_batch_job = ["s3"]
114-
ses = []
115-
sns = ["serde_with"]
111+
ses = ["chrono"]
112+
sns = ["chrono", "serde_with"]
116113
sqs = ["serde_with"]
117114
streams = []

lambda-events/src/custom_serde/codebuild_time.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use chrono::{DateTime, TimeZone, Utc};
2-
use serde::de::{Deserialize, Deserializer, Error as DeError, Visitor};
32
use serde::ser::Serializer;
3+
use serde::{
4+
de::{Deserializer, Error as DeError, Visitor},
5+
Deserialize,
6+
};
47
use std::fmt;
58

69
// Jan 2, 2006 3:04:05 PM
@@ -10,7 +13,7 @@ struct TimeVisitor;
1013
impl<'de> Visitor<'de> for TimeVisitor {
1114
type Value = DateTime<Utc>;
1215

13-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
16+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1417
write!(formatter, "valid codebuild time: {}", CODEBUILD_TIME_FORMAT)
1518
}
1619

@@ -74,7 +77,7 @@ mod tests {
7477
#[serde(with = "str_time")]
7578
pub date: TestTime,
7679
}
77-
let data = json!({
80+
let data = serde_json::json!({
7881
"date": "Sep 1, 2017 4:12:29 PM"
7982
});
8083

@@ -92,7 +95,7 @@ mod tests {
9295
#[serde(with = "optional_time")]
9396
pub date: Option<TestTime>,
9497
}
95-
let data = json!({
98+
let data = serde_json::json!({
9699
"date": "Sep 1, 2017 4:12:29 PM"
97100
});
98101

lambda-events/src/custom_serde/float_unix_epoch.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ fn ne_timestamp<T: fmt::Display>(ts: T) -> SerdeError<T, u8> {
1414
}
1515

1616
impl<V: fmt::Display, D: fmt::Display> fmt::Debug for SerdeError<V, D> {
17-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
17+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1818
write!(f, "ChronoSerdeError({})", self)
1919
}
2020
}
2121

2222
impl<V: fmt::Display, D: fmt::Display> fmt::Display for SerdeError<V, D> {
23-
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
23+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2424
match *self {
2525
SerdeError::NonExistent { ref timestamp } => {
2626
write!(f, "value is not a legal timestamp: {}", timestamp)
@@ -77,7 +77,7 @@ where
7777
impl<'de> de::Visitor<'de> for SecondsFloatTimestampVisitor {
7878
type Value = DateTime<Utc>;
7979

80-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
80+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
8181
formatter.write_str("a unix timestamp as a float")
8282
}
8383

lambda-events/src/custom_serde/headers.rs

+7-6
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl<'de> Visitor<'de> for HeaderMapVisitor {
4949
type Value = HeaderMap;
5050

5151
// Format a message stating what data this Visitor expects to receive.
52-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
52+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
5353
formatter.write_str("lots of things can go wrong with HeaderMap")
5454
}
5555

@@ -81,7 +81,7 @@ impl<'de> Visitor<'de> for HeaderMapVisitor {
8181
let mut map = HeaderMap::with_capacity(access.size_hint().unwrap_or(0));
8282

8383
if !self.is_human_readable {
84-
while let Some((key, arr)) = access.next_entry::<Cow<str>, Vec<Cow<[u8]>>>()? {
84+
while let Some((key, arr)) = access.next_entry::<Cow<'_, str>, Vec<Cow<'_, [u8]>>>()? {
8585
let key = HeaderName::from_bytes(key.as_bytes())
8686
.map_err(|_| de::Error::invalid_value(Unexpected::Str(&key), &self))?;
8787
for val in arr {
@@ -91,7 +91,7 @@ impl<'de> Visitor<'de> for HeaderMapVisitor {
9191
}
9292
}
9393
} else {
94-
while let Some((key, val)) = access.next_entry::<Cow<str>, OneOrMore>()? {
94+
while let Some((key, val)) = access.next_entry::<Cow<'_, str>, OneOrMore<'_>>()? {
9595
let key = HeaderName::from_bytes(key.as_bytes())
9696
.map_err(|_| de::Error::invalid_value(Unexpected::Str(&key), &self))?;
9797
match val {
@@ -135,6 +135,7 @@ where
135135
#[cfg(test)]
136136
mod tests {
137137
use super::*;
138+
use serde::{Deserialize, Serialize};
138139

139140
#[test]
140141
fn test_deserialize_missing_http_headers() {
@@ -143,7 +144,7 @@ mod tests {
143144
#[serde(deserialize_with = "deserialize_headers", default)]
144145
pub headers: HeaderMap,
145146
}
146-
let data = json!({
147+
let data = serde_json::json!({
147148
"not_headers": {}
148149
});
149150

@@ -161,7 +162,7 @@ mod tests {
161162
#[serde(serialize_with = "serialize_multi_value_headers")]
162163
headers: HeaderMap,
163164
}
164-
let data = json!({
165+
let data = serde_json::json!({
165166
"headers": {
166167
"Accept": ["*/*"]
167168
}
@@ -181,7 +182,7 @@ mod tests {
181182
#[serde(deserialize_with = "deserialize_headers")]
182183
headers: HeaderMap,
183184
}
184-
let data = json!({ "headers": null });
185+
let data = serde_json::json!({ "headers": null });
185186

186187
let decoded: Test = serde_json::from_value(data).unwrap();
187188
assert!(decoded.headers.is_empty());

lambda-events/src/custom_serde/http_method.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ struct MethodVisitor;
1111
impl<'de> Visitor<'de> for MethodVisitor {
1212
type Value = Method;
1313

14-
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
14+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1515
write!(formatter, "valid method name")
1616
}
1717

@@ -56,6 +56,7 @@ pub fn serialize_optional<S: Serializer>(method: &Option<Method>, ser: S) -> Res
5656
#[cfg(test)]
5757
mod tests {
5858
use super::*;
59+
use serde::{Deserialize, Serialize};
5960

6061
#[test]
6162
fn test_http_method_serializer() {
@@ -64,7 +65,7 @@ mod tests {
6465
#[serde(with = "crate::custom_serde::http_method")]
6566
pub method: http::Method,
6667
}
67-
let data = json!({
68+
let data = serde_json::json!({
6869
"method": "DELETE"
6970
});
7071
let decoded: Test = serde_json::from_value(data.clone()).unwrap();
@@ -83,7 +84,7 @@ mod tests {
8384
#[serde(default)]
8485
pub method: Option<http::Method>,
8586
}
86-
let data = json!({
87+
let data = serde_json::json!({
8788
"method": "DELETE"
8889
});
8990
let decoded: Test = serde_json::from_value(data.clone()).unwrap();
@@ -92,11 +93,11 @@ mod tests {
9293
let recoded = serde_json::to_value(decoded).unwrap();
9394
assert_eq!(data, recoded);
9495

95-
let data = json!({ "method": null });
96+
let data = serde_json::json!({ "method": null });
9697
let decoded: Test = serde_json::from_value(data).unwrap();
9798
assert_eq!(None, decoded.method);
9899

99-
let data = json!({});
100+
let data = serde_json::json!({});
100101
let decoded: Test = serde_json::from_value(data).unwrap();
101102
assert_eq!(None, decoded.method);
102103
}

0 commit comments

Comments
 (0)