Skip to content

Commit 4e77fdb

Browse files
committed
Use compile_error if no http features are enabled
- Provide help so people know that they have to enable a feature. - Put imports in place so conditional compilation doesn't try to compile unnecesary code. Signed-off-by: David Calavera <[email protected]>
1 parent cf72bb0 commit 4e77fdb

File tree

3 files changed

+33
-16
lines changed

3 files changed

+33
-16
lines changed

lambda-http/src/deserializer.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
use crate::request::LambdaRequest;
2-
use aws_lambda_events::{
3-
alb::AlbTargetGroupRequest,
4-
apigw::{ApiGatewayProxyRequest, ApiGatewayV2httpRequest, ApiGatewayWebsocketProxyRequest},
5-
};
62
use serde::{de::Error, Deserialize};
73

84
const ERROR_CONTEXT: &str = "this function expects a JSON payload from Amazon API Gateway, Amazon Elastic Load Balancer, or AWS Lambda Function URLs, but the data doesn't match any of those services' events";
@@ -17,28 +13,29 @@ impl<'de> Deserialize<'de> for LambdaRequest {
1713
Err(err) => return Err(err),
1814
};
1915
#[cfg(feature = "apigw_rest")]
20-
if let Ok(res) =
21-
ApiGatewayProxyRequest::deserialize(serde::__private::de::ContentRefDeserializer::<D::Error>::new(&content))
22-
{
16+
if let Ok(res) = aws_lambda_events::apigw::ApiGatewayProxyRequest::deserialize(
17+
serde::__private::de::ContentRefDeserializer::<D::Error>::new(&content),
18+
) {
2319
return Ok(LambdaRequest::ApiGatewayV1(res));
2420
}
2521
#[cfg(feature = "apigw_http")]
26-
if let Ok(res) = ApiGatewayV2httpRequest::deserialize(
22+
if let Ok(res) = aws_lambda_events::apigw::ApiGatewayV2httpRequest::deserialize(
2723
serde::__private::de::ContentRefDeserializer::<D::Error>::new(&content),
2824
) {
2925
return Ok(LambdaRequest::ApiGatewayV2(res));
3026
}
3127
#[cfg(feature = "alb")]
3228
if let Ok(res) =
33-
AlbTargetGroupRequest::deserialize(serde::__private::de::ContentRefDeserializer::<D::Error>::new(&content))
29+
aws_lambda_events::alb::AlbTargetGroupRequest::deserialize(serde::__private::de::ContentRefDeserializer::<
30+
D::Error,
31+
>::new(&content))
3432
{
3533
return Ok(LambdaRequest::Alb(res));
3634
}
3735
#[cfg(feature = "apigw_websockets")]
38-
if let Ok(res) = ApiGatewayWebsocketProxyRequest::deserialize(serde::__private::de::ContentRefDeserializer::<
39-
D::Error,
40-
>::new(&content))
41-
{
36+
if let Ok(res) = aws_lambda_events::apigw::ApiGatewayWebsocketProxyRequest::deserialize(
37+
serde::__private::de::ContentRefDeserializer::<D::Error>::new(&content),
38+
) {
4239
return Ok(LambdaRequest::WebSocket(res));
4340
}
4441

lambda-http/src/request.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
//! [`RequestExt`]: crate::RequestExt
99
#[cfg(any(feature = "apigw_rest", feature = "apigw_http", feature = "apigw_websockets"))]
1010
use crate::ext::extensions::{PathParameters, StageVariables};
11+
#[cfg(any(
12+
feature = "apigw_rest",
13+
feature = "apigw_http",
14+
feature = "alb",
15+
feature = "apigw_websockets"
16+
))]
1117
use crate::ext::extensions::{QueryStringParameters, RawHttpPath};
1218
#[cfg(feature = "alb")]
1319
use aws_lambda_events::alb::{AlbTargetGroupRequest, AlbTargetGroupRequestContext};
@@ -26,7 +32,7 @@ use serde_json::error::Error as JsonError;
2632

2733
use std::future::Future;
2834
use std::pin::Pin;
29-
use std::{env, io::Read, mem};
35+
use std::{env, io::Read};
3036
use url::Url;
3137

3238
/// Internal representation of an Lambda http event from
@@ -61,6 +67,13 @@ impl LambdaRequest {
6167
LambdaRequest::Alb { .. } => RequestOrigin::Alb,
6268
#[cfg(feature = "apigw_websockets")]
6369
LambdaRequest::WebSocket { .. } => RequestOrigin::WebSocket,
70+
#[cfg(not(any(
71+
feature = "apigw_rest",
72+
feature = "apigw_http",
73+
feature = "alb",
74+
feature = "apigw_websockets"
75+
)))]
76+
_ => compile_error!("Either feature `apigw_rest`, `apigw_http`, `alb`, or `apigw_websockets` must be enabled for the `lambda-http` crate."),
6477
}
6578
}
6679
}
@@ -141,8 +154,8 @@ fn into_api_gateway_v2_request(ag: ApiGatewayV2httpRequest) -> http::Request<Bod
141154
.expect("failed to build request");
142155

143156
// no builder method that sets headers in batch
144-
let _ = mem::replace(req.headers_mut(), headers);
145-
let _ = mem::replace(req.method_mut(), http_method);
157+
let _ = std::mem::replace(req.headers_mut(), headers);
158+
let _ = std::mem::replace(req.method_mut(), http_method);
146159

147160
req
148161
}

lambda-http/src/response.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,13 @@ impl LambdaResponse {
114114
headers: headers.clone(),
115115
multi_value_headers: headers,
116116
}),
117+
#[cfg(not(any(
118+
feature = "apigw_rest",
119+
feature = "apigw_http",
120+
feature = "alb",
121+
feature = "apigw_websockets"
122+
)))]
123+
_ => compile_error!("Either feature `apigw_rest`, `apigw_http`, `alb`, or `apigw_websockets` must be enabled for the `lambda-http` crate."),
117124
}
118125
}
119126
}

0 commit comments

Comments
 (0)