Improve api (#58)

* wip improve_api

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improved cloudevent-sdk-reqwest api

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api finalise#1

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api(reqwest) finalise#2

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api(reqwest) finalise#2

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* tested api calls within rust

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* tested api calls within rust#2

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api actix finalise#1

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api actix finalise#2

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* added documentation for actix api modifications

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* added documentation for actix api modifications#2

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* improve_api actix-web finalise#3

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>

* minor fixes for improve_api(actix)

Signed-off-by: Pranav Bhatt <adpranavb2000@gmail.com>
This commit is contained in:
Pranav Bhatt 2020-06-24 13:05:49 +05:30 committed by GitHub
parent f6770b4591
commit 57f42cf753
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 63 additions and 18 deletions

View File

@ -15,6 +15,7 @@ readme = "README.md"
cloudevents-sdk = { version = "0.1.0", path = ".." }
actix-web = "2"
actix-rt = "1"
async-trait = "^0.1.33"
lazy_static = "1.4.0"
bytes = "^0.5"
futures = "^0.3"

View File

@ -5,5 +5,7 @@ mod server_response;
pub use server_request::request_to_event;
pub use server_request::HttpRequestDeserializer;
pub use server_request::RequestExt;
pub use server_response::event_to_response;
pub use server_response::HttpResponseBuilderExt;
pub use server_response::HttpResponseSerializer;

View File

@ -2,6 +2,7 @@ use super::headers;
use actix_web::http::HeaderName;
use actix_web::web::{Bytes, BytesMut};
use actix_web::{web, HttpMessage, HttpRequest};
use async_trait::async_trait;
use cloudevents::event::SpecVersion;
use cloudevents::message::{
BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, MessageDeserializer,
@ -111,6 +112,25 @@ pub async fn request_to_event(
.map_err(actix_web::error::ErrorBadRequest)
}
/// Extention Trait for [`HttpRequest`] which acts as a wrapper for the function [`request_to_event()`]
#[async_trait(?Send)]
pub trait RequestExt {
async fn into_event(
&self,
mut payload: web::Payload,
) -> std::result::Result<Event, actix_web::error::Error>;
}
#[async_trait(?Send)]
impl RequestExt for HttpRequest {
async fn into_event(
&self,
payload: web::Payload,
) -> std::result::Result<Event, actix_web::error::Error> {
request_to_event(self, payload).await
}
}
#[cfg(test)]
mod tests {
use super::*;
@ -145,7 +165,7 @@ mod tests {
.header("ce-time", time.to_rfc3339())
.to_http_parts();
let resp = request_to_event(&req, web::Payload(payload)).await.unwrap();
let resp = req.into_event(web::Payload(payload)).await.unwrap();
assert_eq!(expected, resp);
}
@ -177,7 +197,7 @@ mod tests {
.set_json(&j)
.to_http_parts();
let resp = request_to_event(&req, web::Payload(payload)).await.unwrap();
let resp = req.into_event(web::Payload(payload)).await.unwrap();
assert_eq!(expected, resp);
}
}

View File

@ -2,6 +2,7 @@ use super::headers;
use actix_web::dev::HttpResponseBuilder;
use actix_web::http::{HeaderName, HeaderValue};
use actix_web::HttpResponse;
use async_trait::async_trait;
use cloudevents::event::SpecVersion;
use cloudevents::message::{
BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer,
@ -75,6 +76,25 @@ pub async fn event_to_response(
.map_err(actix_web::error::ErrorBadRequest)
}
/// Extention Trait for [`HttpResponseBuilder`] which acts as a wrapper for the function [`event_to_response()`]
#[async_trait(?Send)]
pub trait HttpResponseBuilderExt {
async fn event(
self,
event: Event,
) -> std::result::Result<HttpResponse, actix_web::error::Error>;
}
#[async_trait(?Send)]
impl HttpResponseBuilderExt for HttpResponseBuilder {
async fn event(
self,
event: Event,
) -> std::result::Result<HttpResponse, actix_web::error::Error> {
event_to_response(event, self).await
}
}
#[cfg(test)]
mod tests {
use super::*;
@ -97,7 +117,8 @@ mod tests {
.build()
.unwrap();
let resp = event_to_response(input, HttpResponseBuilder::new(StatusCode::OK))
let resp = HttpResponseBuilder::new(StatusCode::OK)
.event(input)
.await
.unwrap();
@ -140,7 +161,8 @@ mod tests {
.build()
.unwrap();
let mut resp = event_to_response(input, HttpResponseBuilder::new(StatusCode::OK))
let mut resp = HttpResponseBuilder::new(StatusCode::OK)
.event(input)
.await
.unwrap();

View File

@ -109,7 +109,6 @@ mod tests {
.unwrap();
let client = reqwest::Client::new();
client
.post(&url)
.event(input)

View File

@ -1,12 +1,13 @@
use actix_web::{get, post, web, App, HttpRequest, HttpResponse, HttpServer};
use cloudevents::{EventBuilder, EventBuilderV10};
use cloudevents_sdk_actix_web::{HttpResponseBuilderExt, RequestExt};
use serde_json::json;
use std::str::FromStr;
use url::Url;
#[post("/")]
async fn post_event(req: HttpRequest, payload: web::Payload) -> Result<String, actix_web::Error> {
let event = cloudevents_sdk_actix_web::request_to_event(&req, payload).await?;
let event = req.into_event(payload).await?;
println!("Received Event: {:?}", event);
Ok(format!("{:?}", event))
}
@ -15,18 +16,18 @@ async fn post_event(req: HttpRequest, payload: web::Payload) -> Result<String, a
async fn get_event() -> Result<HttpResponse, actix_web::Error> {
let payload = json!({"hello": "world"});
Ok(cloudevents_sdk_actix_web::event_to_response(
EventBuilderV10::new()
.id("0001")
.ty("example.test")
.source(Url::from_str("http://localhost/").unwrap())
.data("application/json", payload)
.extension("someint", "10")
.build()
.unwrap(),
HttpResponse::Ok(),
)
.await?)
Ok(HttpResponse::Ok()
.event(
EventBuilderV10::new()
.id("0001")
.ty("example.test")
.source(Url::from_str("http://localhost/").unwrap())
.data("application/json", payload)
.extension("someint", "10")
.build()
.unwrap(),
)
.await?)
}
#[actix_rt::main]