Skip to content

Commit 57f42cf

Browse files
authored
Improve api (cloudevents#58)
* wip improve_api Signed-off-by: Pranav Bhatt <[email protected]> * improved cloudevent-sdk-reqwest api Signed-off-by: Pranav Bhatt <[email protected]> Signed-off-by: Pranav Bhatt <[email protected]> * improve_api finalise#1 Signed-off-by: Pranav Bhatt <[email protected]> Signed-off-by: Pranav Bhatt <[email protected]> * improve_api(reqwest) finalise#2 Signed-off-by: Pranav Bhatt <[email protected]> Signed-off-by: Pranav Bhatt <[email protected]> * improve_api(reqwest) finalise#2 Signed-off-by: Pranav Bhatt <[email protected]> Signed-off-by: Pranav Bhatt <[email protected]> * tested api calls within rust Signed-off-by: Pranav Bhatt <[email protected]> * tested api calls within rust#2 Signed-off-by: Pranav Bhatt <[email protected]> * improve_api actix finalise#1 Signed-off-by: Pranav Bhatt <[email protected]> * improve_api actix finalise#2 Signed-off-by: Pranav Bhatt <[email protected]> * added documentation for actix api modifications Signed-off-by: Pranav Bhatt <[email protected]> * added documentation for actix api modifications#2 Signed-off-by: Pranav Bhatt <[email protected]> * improve_api actix-web finalise#3 Signed-off-by: Pranav Bhatt <[email protected]> * minor fixes for improve_api(actix) Signed-off-by: Pranav Bhatt <[email protected]>
1 parent f6770b4 commit 57f42cf

File tree

6 files changed

+63
-18
lines changed

6 files changed

+63
-18
lines changed

cloudevents-sdk-actix-web/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ readme = "README.md"
1515
cloudevents-sdk = { version = "0.1.0", path = ".." }
1616
actix-web = "2"
1717
actix-rt = "1"
18+
async-trait = "^0.1.33"
1819
lazy_static = "1.4.0"
1920
bytes = "^0.5"
2021
futures = "^0.3"

cloudevents-sdk-actix-web/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,7 @@ mod server_response;
55

66
pub use server_request::request_to_event;
77
pub use server_request::HttpRequestDeserializer;
8+
pub use server_request::RequestExt;
89
pub use server_response::event_to_response;
10+
pub use server_response::HttpResponseBuilderExt;
911
pub use server_response::HttpResponseSerializer;

cloudevents-sdk-actix-web/src/server_request.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::headers;
22
use actix_web::http::HeaderName;
33
use actix_web::web::{Bytes, BytesMut};
44
use actix_web::{web, HttpMessage, HttpRequest};
5+
use async_trait::async_trait;
56
use cloudevents::event::SpecVersion;
67
use cloudevents::message::{
78
BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, MessageDeserializer,
@@ -111,6 +112,25 @@ pub async fn request_to_event(
111112
.map_err(actix_web::error::ErrorBadRequest)
112113
}
113114

115+
/// Extention Trait for [`HttpRequest`] which acts as a wrapper for the function [`request_to_event()`]
116+
#[async_trait(?Send)]
117+
pub trait RequestExt {
118+
async fn into_event(
119+
&self,
120+
mut payload: web::Payload,
121+
) -> std::result::Result<Event, actix_web::error::Error>;
122+
}
123+
124+
#[async_trait(?Send)]
125+
impl RequestExt for HttpRequest {
126+
async fn into_event(
127+
&self,
128+
payload: web::Payload,
129+
) -> std::result::Result<Event, actix_web::error::Error> {
130+
request_to_event(self, payload).await
131+
}
132+
}
133+
114134
#[cfg(test)]
115135
mod tests {
116136
use super::*;
@@ -145,7 +165,7 @@ mod tests {
145165
.header("ce-time", time.to_rfc3339())
146166
.to_http_parts();
147167

148-
let resp = request_to_event(&req, web::Payload(payload)).await.unwrap();
168+
let resp = req.into_event(web::Payload(payload)).await.unwrap();
149169
assert_eq!(expected, resp);
150170
}
151171

@@ -177,7 +197,7 @@ mod tests {
177197
.set_json(&j)
178198
.to_http_parts();
179199

180-
let resp = request_to_event(&req, web::Payload(payload)).await.unwrap();
200+
let resp = req.into_event(web::Payload(payload)).await.unwrap();
181201
assert_eq!(expected, resp);
182202
}
183203
}

cloudevents-sdk-actix-web/src/server_response.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use super::headers;
22
use actix_web::dev::HttpResponseBuilder;
33
use actix_web::http::{HeaderName, HeaderValue};
44
use actix_web::HttpResponse;
5+
use async_trait::async_trait;
56
use cloudevents::event::SpecVersion;
67
use cloudevents::message::{
78
BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer,
@@ -75,6 +76,25 @@ pub async fn event_to_response(
7576
.map_err(actix_web::error::ErrorBadRequest)
7677
}
7778

79+
/// Extention Trait for [`HttpResponseBuilder`] which acts as a wrapper for the function [`event_to_response()`]
80+
#[async_trait(?Send)]
81+
pub trait HttpResponseBuilderExt {
82+
async fn event(
83+
self,
84+
event: Event,
85+
) -> std::result::Result<HttpResponse, actix_web::error::Error>;
86+
}
87+
88+
#[async_trait(?Send)]
89+
impl HttpResponseBuilderExt for HttpResponseBuilder {
90+
async fn event(
91+
self,
92+
event: Event,
93+
) -> std::result::Result<HttpResponse, actix_web::error::Error> {
94+
event_to_response(event, self).await
95+
}
96+
}
97+
7898
#[cfg(test)]
7999
mod tests {
80100
use super::*;
@@ -97,7 +117,8 @@ mod tests {
97117
.build()
98118
.unwrap();
99119

100-
let resp = event_to_response(input, HttpResponseBuilder::new(StatusCode::OK))
120+
let resp = HttpResponseBuilder::new(StatusCode::OK)
121+
.event(input)
101122
.await
102123
.unwrap();
103124

@@ -140,7 +161,8 @@ mod tests {
140161
.build()
141162
.unwrap();
142163

143-
let mut resp = event_to_response(input, HttpResponseBuilder::new(StatusCode::OK))
164+
let mut resp = HttpResponseBuilder::new(StatusCode::OK)
165+
.event(input)
144166
.await
145167
.unwrap();
146168

cloudevents-sdk-reqwest/src/client_request.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ mod tests {
109109
.unwrap();
110110

111111
let client = reqwest::Client::new();
112-
113112
client
114113
.post(&url)
115114
.event(input)

example-projects/actix-web-example/src/main.rs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use actix_web::{get, post, web, App, HttpRequest, HttpResponse, HttpServer};
22
use cloudevents::{EventBuilder, EventBuilderV10};
3+
use cloudevents_sdk_actix_web::{HttpResponseBuilderExt, RequestExt};
34
use serde_json::json;
45
use std::str::FromStr;
56
use url::Url;
67

78
#[post("/")]
89
async fn post_event(req: HttpRequest, payload: web::Payload) -> Result<String, actix_web::Error> {
9-
let event = cloudevents_sdk_actix_web::request_to_event(&req, payload).await?;
10+
let event = req.into_event(payload).await?;
1011
println!("Received Event: {:?}", event);
1112
Ok(format!("{:?}", event))
1213
}
@@ -15,18 +16,18 @@ async fn post_event(req: HttpRequest, payload: web::Payload) -> Result<String, a
1516
async fn get_event() -> Result<HttpResponse, actix_web::Error> {
1617
let payload = json!({"hello": "world"});
1718

18-
Ok(cloudevents_sdk_actix_web::event_to_response(
19-
EventBuilderV10::new()
20-
.id("0001")
21-
.ty("example.test")
22-
.source(Url::from_str("http://localhost/").unwrap())
23-
.data("application/json", payload)
24-
.extension("someint", "10")
25-
.build()
26-
.unwrap(),
27-
HttpResponse::Ok(),
28-
)
29-
.await?)
19+
Ok(HttpResponse::Ok()
20+
.event(
21+
EventBuilderV10::new()
22+
.id("0001")
23+
.ty("example.test")
24+
.source(Url::from_str("http://localhost/").unwrap())
25+
.data("application/json", payload)
26+
.extension("someint", "10")
27+
.build()
28+
.unwrap(),
29+
)
30+
.await?)
3031
}
3132

3233
#[actix_rt::main]

0 commit comments

Comments
 (0)