From 1595968954bffc1ec764ab0dff42f88004a5c2b8 Mon Sep 17 00:00:00 2001 From: Omar Zabala-Ferrera <73452461+ozabalaferrera@users.noreply.github.com> Date: Sat, 27 Jul 2024 22:59:25 -0400 Subject: [PATCH] Add separate old http feature and prep for PR. Signed-off-by: Omar Zabala-Ferrera <73452461+ozabalaferrera@users.noreply.github.com> --- Cargo.toml | 3 +- README.md | 2 +- src/binding/actix/server_request.rs | 12 ++--- src/binding/actix/server_response.rs | 10 +---- src/binding/axum/extract.rs | 18 +++----- src/binding/http/builder/adapter.rs | 4 +- src/binding/http/deserializer.rs | 27 +++-------- src/binding/http/serializer.rs | 54 ++++++---------------- src/binding/http_0_2/builder/adapter.rs | 9 ++-- src/binding/http_0_2/deserializer.rs | 27 +++-------- src/binding/http_0_2/serializer.rs | 54 ++++++---------------- src/binding/mod.rs | 13 +++--- src/binding/poem/extractor.rs | 5 +-- src/binding/poem/response.rs | 7 +-- src/binding/reqwest/client_request.rs | 25 +++-------- src/binding/reqwest/client_response.rs | 2 +- src/binding/warp/filter.rs | 8 +--- src/event/format.rs | 59 +++++++------------------ src/event/mod.rs | 31 +++---------- src/event/v03/attributes.rs | 56 ++++++----------------- src/event/v03/format.rs | 43 +++++------------- src/event/v10/attributes.rs | 56 ++++++----------------- src/event/v10/format.rs | 54 +++++++--------------- src/lib.rs | 2 +- 24 files changed, 160 insertions(+), 421 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index abe0f650..9c2443c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cloudevents-sdk" -version = "0.7.0" +version = "0.8.0" authors = ["Francesco Guardiani "] license-file = "LICENSE" edition = "2018" @@ -23,6 +23,7 @@ name = "cloudevents" [features] http-binding = ["async-trait", "bytes", "futures", "http"] +http-0-2-binding = ["async-trait", "bytes", "futures", "http-0-2"] actix = ["actix-web", "actix-http", "async-trait", "bytes", "futures", "http-0-2"] reqwest = ["reqwest-lib", "async-trait", "bytes", "http", "uuid/js"] rdkafka = ["rdkafka-lib", "bytes", "futures"] diff --git a/README.md b/README.md index 904163f2..3c8d06f0 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ enabling your Protocol Binding of choice: ```toml [dependencies] -cloudevents-sdk = { version = "0.7.0" } +cloudevents-sdk = { version = "0.8.0" } ``` Now you can start creating events: diff --git a/src/binding/actix/server_request.rs b/src/binding/actix/server_request.rs index 64380084..60e168c2 100644 --- a/src/binding/actix/server_request.rs +++ b/src/binding/actix/server_request.rs @@ -10,8 +10,7 @@ use http_0_2 as http; /// Implement Headers for the actix HeaderMap impl<'a> Headers<'a> for actix_http::header::HeaderMap { - type Iterator = - Box + 'a>; + type Iterator = Box + 'a>; fn get(&self, key: K) -> Option<&HeaderValue> { self.get(key.as_str()) } @@ -29,15 +28,13 @@ pub async fn request_to_event( while let Some(item) = payload.next().await { bytes.extend_from_slice(&item?); } - to_event(req.headers(), bytes.to_vec()) - .map_err(actix_web::error::ErrorBadRequest) + to_event(req.headers(), bytes.to_vec()).map_err(actix_web::error::ErrorBadRequest) } /// So that an actix-web handler may take an Event parameter impl actix_web::FromRequest for Event { type Error = actix_web::Error; - type Future = - LocalBoxFuture<'static, std::result::Result>; + type Future = LocalBoxFuture<'static, std::result::Result>; fn from_request(r: &HttpRequest, p: &mut Payload) -> Self::Future { let request = r.to_owned(); @@ -145,8 +142,7 @@ mod tests { "datacontenttype": "application/json", "data": fixtures::json_data() }); - let bytes = serde_json::to_string(&payload) - .expect("Failed to serialize test data to json"); + let bytes = serde_json::to_string(&payload).expect("Failed to serialize test data to json"); let expected = fixtures::v10::full_json_data_string_extension(); diff --git a/src/binding/actix/server_response.rs b/src/binding/actix/server_response.rs index 5359c031..11c30930 100644 --- a/src/binding/actix/server_response.rs +++ b/src/binding/actix/server_response.rs @@ -39,17 +39,11 @@ impl actix_web::Responder for Event { /// This trait is sealed and cannot be implemented for types outside of this crate. pub trait HttpResponseBuilderExt: private::Sealed { /// Fill this [`HttpResponseBuilder`] with an [`Event`]. - fn event( - self, - event: Event, - ) -> std::result::Result; + fn event(self, event: Event) -> std::result::Result; } impl HttpResponseBuilderExt for HttpResponseBuilder { - fn event( - self, - event: Event, - ) -> std::result::Result { + fn event(self, event: Event) -> std::result::Result { event_to_response(event, self) } } diff --git a/src/binding/axum/extract.rs b/src/binding/axum/extract.rs index eedbb2b5..549df0a4 100644 --- a/src/binding/axum/extract.rs +++ b/src/binding/axum/extract.rs @@ -17,19 +17,15 @@ where { type Rejection = Response; - async fn from_request( - req: Request, - _state: &S, - ) -> Result { + async fn from_request(req: Request, _state: &S) -> Result { let (parts, body) = req.into_parts(); - let body = - axum::body::to_bytes(body, usize::MAX).await.map_err(|e| { - Response::builder() - .status(StatusCode::INTERNAL_SERVER_ERROR) - .body(axum::body::Body::from(e.to_string())) - .unwrap() - })?; + let body = axum::body::to_bytes(body, usize::MAX).await.map_err(|e| { + Response::builder() + .status(StatusCode::INTERNAL_SERVER_ERROR) + .body(axum::body::Body::from(e.to_string())) + .unwrap() + })?; to_event(&parts.headers, body.to_vec()).map_err(|e| { Response::builder() diff --git a/src/binding/http/builder/adapter.rs b/src/binding/http/builder/adapter.rs index 8a9275bf..aab26952 100644 --- a/src/binding/http/builder/adapter.rs +++ b/src/binding/http/builder/adapter.rs @@ -32,9 +32,7 @@ impl Builder> for Adapter { } } -pub fn to_response( - event: Event, -) -> std::result::Result, Error> { +pub fn to_response(event: Event) -> std::result::Result, Error> { BinaryDeserializer::deserialize_binary( event, Serializer::new(Adapter { diff --git a/src/binding/http/deserializer.rs b/src/binding/http/deserializer.rs index 74774011..782184f9 100644 --- a/src/binding/http/deserializer.rs +++ b/src/binding/http/deserializer.rs @@ -4,9 +4,8 @@ use crate::{ event::SpecVersion, header_value_to_str, message, message::{ - BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, - MessageDeserializer, Result, StructuredDeserializer, - StructuredSerializer, + BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, MessageDeserializer, + Result, StructuredDeserializer, StructuredSerializer, }, }; @@ -25,10 +24,7 @@ impl<'a, T: Headers<'a>> Deserializer<'a, T> { } impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { - fn deserialize_binary>( - self, - mut visitor: V, - ) -> Result { + fn deserialize_binary>(self, mut visitor: V) -> Result { if self.encoding() != Encoding::BINARY { return Err(message::Error::WrongEncoding {}); } @@ -53,16 +49,12 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { if attributes.contains(&name) { visitor = visitor.set_attribute( name, - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } else { visitor = visitor.set_extension( name, - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } } @@ -70,9 +62,7 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { if let Some(hv) = self.headers.get(http::header::CONTENT_TYPE) { visitor = visitor.set_attribute( "datacontenttype", - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } @@ -85,10 +75,7 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { } impl<'a, T: Headers<'a>> StructuredDeserializer for Deserializer<'a, T> { - fn deserialize_structured>( - self, - visitor: V, - ) -> Result { + fn deserialize_structured>(self, visitor: V) -> Result { if self.encoding() != Encoding::STRUCTURED { return Err(message::Error::WrongEncoding {}); } diff --git a/src/binding/http/serializer.rs b/src/binding/http/serializer.rs index 24e8c7c2..3f63b5bf 100644 --- a/src/binding/http/serializer.rs +++ b/src/binding/http/serializer.rs @@ -8,8 +8,7 @@ use crate::binding::{ use crate::event::SpecVersion; use crate::message::BinaryDeserializer; use crate::message::{ - BinarySerializer, Error, MessageAttributeValue, Result, - StructuredSerializer, + BinarySerializer, Error, MessageAttributeValue, Result, StructuredSerializer, }; use crate::Event; use http::Request; @@ -20,11 +19,11 @@ use std::fmt::Debug; macro_rules! str_to_header_value { ($header_value:expr) => { - http::header::HeaderValue::from_str(&$header_value.to_string()).map_err( - |e| crate::message::Error::Other { + http::header::HeaderValue::from_str(&$header_value.to_string()).map_err(|e| { + crate::message::Error::Other { source: Box::new(e), - }, - ) + } + }) }; } @@ -47,22 +46,14 @@ impl BinarySerializer for Serializer { Ok(self) } - fn set_attribute( - self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_attribute(self, name: &str, value: MessageAttributeValue) -> Result { self.builder .borrow_mut() .header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) } - fn set_extension( - self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_extension(self, name: &str, value: MessageAttributeValue) -> Result { self.builder .borrow_mut() .header(&header_prefix(name), str_to_header_value!(value)?); @@ -89,8 +80,7 @@ impl StructuredSerializer for Serializer { } } -impl BinarySerializer>> - for http::request::Builder +impl BinarySerializer>> for http::request::Builder where T: TryFrom>, >>::Error: Debug, @@ -100,30 +90,19 @@ where Ok(self) } - fn set_attribute( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self = self.header(key, &value.to_string()); Ok(self) } - fn set_extension( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self = self.header(key, &value.to_string()); Ok(self) } - fn end_with_data( - self, - bytes: Vec, - ) -> Result>> { + fn end_with_data(self, bytes: Vec) -> Result>> { let body = T::try_from(bytes).unwrap(); self.body(Some(body)).map_err(|e| Error::Other { source: Box::new(e), @@ -145,10 +124,7 @@ where type Error = crate::message::Error; fn try_from(event: Event) -> Result { - BinaryDeserializer::deserialize_binary( - event, - http::request::Builder::new(), - ) + BinaryDeserializer::deserialize_binary(event, http::request::Builder::new()) } } @@ -164,8 +140,7 @@ mod tests { #[test] fn test_event_to_http_request() { let event = fixtures::v10::minimal_string_extension(); - let request: Request>> = - Request::try_from(event).unwrap(); + let request: Request>> = Request::try_from(event).unwrap(); assert_eq!(request.headers()["ce-id"], "0001"); assert_eq!(request.headers()["ce-type"], "test_event.test_application"); @@ -174,8 +149,7 @@ mod tests { #[test] fn test_event_to_bytes_body() { let event = fixtures::v10::full_binary_json_data_string_extension(); - let request: Request>> = - Request::try_from(event).unwrap(); + let request: Request>> = Request::try_from(event).unwrap(); assert_eq!(request.headers()["ce-id"], "0001"); assert_eq!(request.headers()["ce-type"], "test_event.test_application"); diff --git a/src/binding/http_0_2/builder/adapter.rs b/src/binding/http_0_2/builder/adapter.rs index 9bcfd7ae..f2acb79d 100644 --- a/src/binding/http_0_2/builder/adapter.rs +++ b/src/binding/http_0_2/builder/adapter.rs @@ -17,11 +17,12 @@ impl Builder> for Adapter { self.builder.set(self.builder.take().header(key, value)); } fn body(&mut self, bytes: Vec) -> Result> { - self.builder.take().body(Body::from(bytes)).map_err(|e| { - crate::message::Error::Other { + self.builder + .take() + .body(Body::from(bytes)) + .map_err(|e| crate::message::Error::Other { source: Box::new(e), - } - }) + }) } fn finish(&mut self) -> Result> { self.body(Vec::new()) diff --git a/src/binding/http_0_2/deserializer.rs b/src/binding/http_0_2/deserializer.rs index 5fcaf994..414137b2 100644 --- a/src/binding/http_0_2/deserializer.rs +++ b/src/binding/http_0_2/deserializer.rs @@ -4,9 +4,8 @@ use crate::{ event::SpecVersion, header_value_to_str, message, message::{ - BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, - MessageDeserializer, Result, StructuredDeserializer, - StructuredSerializer, + BinaryDeserializer, BinarySerializer, Encoding, MessageAttributeValue, MessageDeserializer, + Result, StructuredDeserializer, StructuredSerializer, }, }; use http_0_2 as http; @@ -24,10 +23,7 @@ impl<'a, T: Headers<'a>> Deserializer<'a, T> { } impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { - fn deserialize_binary>( - self, - mut visitor: V, - ) -> Result { + fn deserialize_binary>(self, mut visitor: V) -> Result { if self.encoding() != Encoding::BINARY { return Err(message::Error::WrongEncoding {}); } @@ -52,16 +48,12 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { if attributes.contains(&name) { visitor = visitor.set_attribute( name, - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } else { visitor = visitor.set_extension( name, - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } } @@ -69,9 +61,7 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { if let Some(hv) = self.headers.get(http::header::CONTENT_TYPE) { visitor = visitor.set_attribute( "datacontenttype", - MessageAttributeValue::String(String::from( - header_value_to_str!(hv)?, - )), + MessageAttributeValue::String(String::from(header_value_to_str!(hv)?)), )? } @@ -84,10 +74,7 @@ impl<'a, T: Headers<'a>> BinaryDeserializer for Deserializer<'a, T> { } impl<'a, T: Headers<'a>> StructuredDeserializer for Deserializer<'a, T> { - fn deserialize_structured>( - self, - visitor: V, - ) -> Result { + fn deserialize_structured>(self, visitor: V) -> Result { if self.encoding() != Encoding::STRUCTURED { return Err(message::Error::WrongEncoding {}); } diff --git a/src/binding/http_0_2/serializer.rs b/src/binding/http_0_2/serializer.rs index e4acbe1a..730be732 100644 --- a/src/binding/http_0_2/serializer.rs +++ b/src/binding/http_0_2/serializer.rs @@ -8,8 +8,7 @@ use crate::binding::{ use crate::event::SpecVersion; use crate::message::BinaryDeserializer; use crate::message::{ - BinarySerializer, Error, MessageAttributeValue, Result, - StructuredSerializer, + BinarySerializer, Error, MessageAttributeValue, Result, StructuredSerializer, }; use crate::Event; use http::Request; @@ -19,11 +18,11 @@ use std::fmt::Debug; macro_rules! str_to_header_value { ($header_value:expr) => { - http::header::HeaderValue::from_str(&$header_value.to_string()).map_err( - |e| crate::message::Error::Other { + http::header::HeaderValue::from_str(&$header_value.to_string()).map_err(|e| { + crate::message::Error::Other { source: Box::new(e), - }, - ) + } + }) }; } @@ -46,22 +45,14 @@ impl BinarySerializer for Serializer { Ok(self) } - fn set_attribute( - self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_attribute(self, name: &str, value: MessageAttributeValue) -> Result { self.builder .borrow_mut() .header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) } - fn set_extension( - self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_extension(self, name: &str, value: MessageAttributeValue) -> Result { self.builder .borrow_mut() .header(&header_prefix(name), str_to_header_value!(value)?); @@ -88,8 +79,7 @@ impl StructuredSerializer for Serializer { } } -impl BinarySerializer>> - for http::request::Builder +impl BinarySerializer>> for http::request::Builder where T: TryFrom>, >>::Error: Debug, @@ -99,30 +89,19 @@ where Ok(self) } - fn set_attribute( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self = self.header(key, &value.to_string()); Ok(self) } - fn set_extension( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self = self.header(key, &value.to_string()); Ok(self) } - fn end_with_data( - self, - bytes: Vec, - ) -> Result>> { + fn end_with_data(self, bytes: Vec) -> Result>> { let body = T::try_from(bytes).unwrap(); self.body(Some(body)).map_err(|e| Error::Other { source: Box::new(e), @@ -144,10 +123,7 @@ where type Error = crate::message::Error; fn try_from(event: Event) -> Result { - BinaryDeserializer::deserialize_binary( - event, - http::request::Builder::new(), - ) + BinaryDeserializer::deserialize_binary(event, http::request::Builder::new()) } } @@ -162,8 +138,7 @@ mod tests { #[test] fn test_event_to_http_request() { let event = fixtures::v10::minimal_string_extension(); - let request: Request>> = - Request::try_from(event).unwrap(); + let request: Request>> = Request::try_from(event).unwrap(); assert_eq!(request.headers()["ce-id"], "0001"); assert_eq!(request.headers()["ce-type"], "test_event.test_application"); @@ -172,8 +147,7 @@ mod tests { #[test] fn test_event_to_bytes_body() { let event = fixtures::v10::full_binary_json_data_string_extension(); - let request: Request>> = - Request::try_from(event).unwrap(); + let request: Request>> = Request::try_from(event).unwrap(); assert_eq!(request.headers()["ce-id"], "0001"); assert_eq!(request.headers()["ce-type"], "test_event.test_application"); diff --git a/src/binding/mod.rs b/src/binding/mod.rs index a55b705f..e42aaa64 100644 --- a/src/binding/mod.rs +++ b/src/binding/mod.rs @@ -24,8 +24,11 @@ pub mod axum; ))] pub mod http; -#[cfg_attr(docsrs, doc(cfg(any(feature = "actix", feature = "warp",))))] -#[cfg(any(feature = "actix", feature = "warp",))] +#[cfg_attr( + docsrs, + doc(cfg(any(feature = "http-0-2-binding", feature = "actix", feature = "warp",))) +)] +#[cfg(any(feature = "http-0-2-binding", feature = "actix", feature = "warp",))] pub mod http_0_2; #[cfg_attr(docsrs, doc(cfg(feature = "nats")))] @@ -52,10 +55,8 @@ pub(crate) mod kafka { } } -pub(crate) static CLOUDEVENTS_JSON_HEADER: &str = - "application/cloudevents+json"; -pub(crate) static CLOUDEVENTS_BATCH_JSON_HEADER: &str = - "application/cloudevents-batch+json"; +pub(crate) static CLOUDEVENTS_JSON_HEADER: &str = "application/cloudevents+json"; +pub(crate) static CLOUDEVENTS_BATCH_JSON_HEADER: &str = "application/cloudevents-batch+json"; pub(crate) static CONTENT_TYPE: &str = "content-type"; fn header_prefix(prefix: &str, name: &str) -> String { diff --git a/src/binding/poem/extractor.rs b/src/binding/poem/extractor.rs index aa027be0..c77eab8b 100644 --- a/src/binding/poem/extractor.rs +++ b/src/binding/poem/extractor.rs @@ -17,10 +17,7 @@ impl ResponseError for crate::message::Error { // lifetime parameters or bounds on method `from_request` do not match the trait declaration // lifetimes do not match method in trait impl<'a> FromRequest<'a> for Event { - async fn from_request( - req: &'a Request, - body: &mut RequestBody, - ) -> Result { + async fn from_request(req: &'a Request, body: &mut RequestBody) -> Result { Ok(to_event(req.headers(), body.take()?.into_vec().await?)?) } } diff --git a/src/binding/poem/response.rs b/src/binding/poem/response.rs index fa7fff31..978dc441 100644 --- a/src/binding/poem/response.rs +++ b/src/binding/poem/response.rs @@ -13,15 +13,12 @@ impl IntoResponse for Event { } for (key, value) in self.iter() { - builder = - builder.header(format!("ce-{key}").as_str(), value.to_string()); + builder = builder.header(format!("ce-{key}").as_str(), value.to_string()); } match self.data { Some(data) => match data { - Data::Binary(v) => { - builder.body(Bytes::copy_from_slice(v.as_slice())) - } + Data::Binary(v) => builder.body(Bytes::copy_from_slice(v.as_slice())), Data::String(s) => builder.body(s.clone()), Data::Json(j) => match serde_json::to_string(&j) { Ok(s) => builder.body(s), diff --git a/src/binding/reqwest/client_request.rs b/src/binding/reqwest/client_request.rs index 0ae0402c..33380a8f 100644 --- a/src/binding/reqwest/client_request.rs +++ b/src/binding/reqwest/client_request.rs @@ -6,8 +6,7 @@ use crate::binding::{ }; use crate::event::SpecVersion; use crate::message::{ - BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, - StructuredSerializer, + BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer, }; use crate::Event; use reqwest::RequestBuilder; @@ -38,21 +37,13 @@ impl BinarySerializer for RequestSerializer { Ok(self) } - fn set_attribute( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self.req = self.req.header(key, value.to_string()); Ok(self) } - fn set_extension( - mut self, - name: &str, - value: MessageAttributeValue, - ) -> Result { + fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { let key = &header_prefix(name); self.req = self.req.header(key, value.to_string()); Ok(self) @@ -77,14 +68,8 @@ impl StructuredSerializer for RequestSerializer { } /// Method to fill a [`RequestBuilder`] with an [`Event`]. -pub fn event_to_request( - event: Event, - request_builder: RequestBuilder, -) -> Result { - BinaryDeserializer::deserialize_binary( - event, - RequestSerializer::new(request_builder), - ) +pub fn event_to_request(event: Event, request_builder: RequestBuilder) -> Result { + BinaryDeserializer::deserialize_binary(event, RequestSerializer::new(request_builder)) } /// Method to fill a [`RequestBuilder`] with a batched [`Vec`]. diff --git a/src/binding/reqwest/client_response.rs b/src/binding/reqwest/client_response.rs index 49212b32..451987ce 100644 --- a/src/binding/reqwest/client_response.rs +++ b/src/binding/reqwest/client_response.rs @@ -4,8 +4,8 @@ use crate::binding; use crate::message::{Error, Result}; use crate::Event; use async_trait::async_trait; -use http::header; use http; +use http::header; use reqwest::Response; /// Method to transform an incoming [`Response`] to [`Event`]. diff --git a/src/binding/warp/filter.rs b/src/binding/warp/filter.rs index 87212612..05f83817 100644 --- a/src/binding/warp/filter.rs +++ b/src/binding/warp/filter.rs @@ -38,10 +38,7 @@ pub fn to_event() -> impl Filter + Copy { .and_then(create_event) } -async fn create_event( - headers: HeaderMap, - body: bytes::Bytes, -) -> Result { +async fn create_event(headers: HeaderMap, body: bytes::Bytes) -> Result { http::to_event(&headers, body.to_vec()) .map_err(|error| warp::reject::custom(EventFilterError { error })) } @@ -119,8 +116,7 @@ mod tests { let mut event = result.clone(); let (_datacontenttype, _dataschema, data) = event.take_data(); let actual_payload: Vec = data.unwrap().try_into().unwrap(); - let expected_payload: Vec = - serde_json::to_vec(&fixtures::json_data()).unwrap(); + let expected_payload: Vec = serde_json::to_vec(&fixtures::json_data()).unwrap(); assert_eq!(expected_payload, actual_payload); assert_eq!(expected, result); diff --git a/src/event/format.rs b/src/event/format.rs index c3a2fc74..60440c3c 100644 --- a/src/event/format.rs +++ b/src/event/format.rs @@ -1,7 +1,6 @@ use super::{ - Attributes, Data, Event, EventFormatDeserializerV03, - EventFormatDeserializerV10, EventFormatSerializerV03, - EventFormatSerializerV10, + Attributes, Data, Event, EventFormatDeserializerV03, EventFormatDeserializerV10, + EventFormatSerializerV03, EventFormatSerializerV10, }; use crate::event::{AttributesReader, ExtensionValue}; use base64::prelude::*; @@ -12,8 +11,7 @@ use std::collections::HashMap; macro_rules! parse_field { ($value:expr, $target_type:ty, $error:ty) => { - <$target_type>::deserialize($value.into_deserializer()) - .map_err(<$error>::custom) + <$target_type>::deserialize($value.into_deserializer()).map_err(<$error>::custom) }; ($value:expr, $target_type:ty, $error:ty, $mapper:expr) => { @@ -67,9 +65,7 @@ pub fn parse_data_base64(v: Value) -> Result, E> { }) } -pub fn parse_data_base64_json( - v: Value, -) -> Result { +pub fn parse_data_base64_json(v: Value) -> Result { let data = parse_data_base64(v)?; serde_json::from_slice(&data).map_err(E::custom) } @@ -84,9 +80,7 @@ pub(crate) trait EventFormatDeserializer { map: &mut Map, ) -> Result, E>; - fn deserialize_event( - mut map: Map, - ) -> Result { + fn deserialize_event(mut map: Map) -> Result { let attributes = Self::deserialize_attributes(&mut map)?; let data = Self::deserialize_data( attributes.datacontenttype().unwrap_or("application/json"), @@ -98,8 +92,7 @@ pub(crate) trait EventFormatDeserializer { .map(|(k, v)| { Ok(( k, - ExtensionValue::deserialize(v.into_deserializer()) - .map_err(E::custom)?, + ExtensionValue::deserialize(v.into_deserializer()).map_err(E::custom)?, )) }) .collect::, E>>()?; @@ -122,24 +115,15 @@ pub(crate) trait EventFormatSerializer { } impl<'de> Deserialize<'de> for Event { - fn deserialize( - deserializer: D, - ) -> Result>::Error> + fn deserialize(deserializer: D) -> Result>::Error> where D: Deserializer<'de>, { let root_value = Value::deserialize(deserializer)?; let mut map: Map = - Map::deserialize(root_value.into_deserializer()) - .map_err(D::Error::custom)?; - - match extract_field!( - map, - "specversion", - String, - >::Error - )? - .as_str() + Map::deserialize(root_value.into_deserializer()).map_err(D::Error::custom)?; + + match extract_field!(map, "specversion", String, >::Error)?.as_str() { "0.3" => EventFormatDeserializerV03::deserialize_event(map), "1.0" => EventFormatDeserializerV10::deserialize_event(map), @@ -152,26 +136,17 @@ impl<'de> Deserialize<'de> for Event { } impl Serialize for Event { - fn serialize( - &self, - serializer: S, - ) -> Result<::Ok, ::Error> + fn serialize(&self, serializer: S) -> Result<::Ok, ::Error> where S: Serializer, { match &self.attributes { - Attributes::V03(a) => EventFormatSerializerV03::serialize( - a, - &self.data, - &self.extensions, - serializer, - ), - Attributes::V10(a) => EventFormatSerializerV10::serialize( - a, - &self.data, - &self.extensions, - serializer, - ), + Attributes::V03(a) => { + EventFormatSerializerV03::serialize(a, &self.data, &self.extensions, serializer) + } + Attributes::V10(a) => { + EventFormatSerializerV10::serialize(a, &self.data, &self.extensions, serializer) + } } } } diff --git a/src/event/mod.rs b/src/event/mod.rs index 6360d871..56f71e60 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -99,26 +99,14 @@ impl AttributesWriter for Event { fn set_id(&mut self, id: impl Into) -> String {} fn set_source(&mut self, source: impl Into) -> UriReference {} fn set_type(&mut self, ty: impl Into) -> String {} - fn set_subject( - &mut self, - subject: Option>, - ) -> Option { - } - fn set_time( - &mut self, - time: Option>>, - ) -> Option> { - } + fn set_subject(&mut self, subject: Option>) -> Option {} + fn set_time(&mut self, time: Option>>) -> Option> {} fn set_datacontenttype( &mut self, datacontenttype: Option>, ) -> Option { } - fn set_dataschema( - &mut self, - dataschema: Option>, - ) -> Option { - } + fn set_dataschema(&mut self, dataschema: Option>) -> Option {} } impl Default for Event { @@ -154,16 +142,12 @@ impl Event { /// Returns an [`Iterator`] for all the available [CloudEvents Context attributes](https://github.com/cloudevents/spec/blob/master/spec.md#context-attributes), excluding extensions. /// This iterator does not contain the `data` field. - pub fn iter_attributes( - &self, - ) -> impl Iterator { + pub fn iter_attributes(&self) -> impl Iterator { self.attributes.iter() } /// Get all the [extensions](https://github.com/cloudevents/spec/blob/master/spec.md#extension-context-attributes) - pub fn iter_extensions( - &self, - ) -> impl Iterator { + pub fn iter_extensions(&self) -> impl Iterator { self.extensions.iter().map(|(k, v)| (k.as_str(), v)) } @@ -225,10 +209,7 @@ impl Event { /// let mut e = Event::default(); /// let old_data = e.set_data_unchecked(json!({})); /// ``` - pub fn set_data_unchecked( - &mut self, - data: impl Into, - ) -> Option { + pub fn set_data_unchecked(&mut self, data: impl Into) -> Option { std::mem::replace(&mut self.data, Some(data.into())) } diff --git a/src/event/v03/attributes.rs b/src/event/v03/attributes.rs index e23c9318..4e509268 100644 --- a/src/event/v03/attributes.rs +++ b/src/event/v03/attributes.rs @@ -1,10 +1,5 @@ -use crate::event::attributes::{ - default_hostname, AttributeValue, AttributesConverter, -}; -use crate::event::{ - AttributesReader, AttributesV10, AttributesWriter, SpecVersion, - UriReference, -}; +use crate::event::attributes::{default_hostname, AttributeValue, AttributesConverter}; +use crate::event::{AttributesReader, AttributesV10, AttributesWriter, SpecVersion, UriReference}; use crate::message::{BinarySerializer, MessageAttributeValue}; use chrono::{DateTime, Utc}; use url::Url; @@ -55,16 +50,10 @@ impl<'a> Iterator for AttributesIntoIterator<'a> { type Item = (&'a str, AttributeValue<'a>); fn next(&mut self) -> Option { let result = match self.index { - 0 => Some(( - "specversion", - AttributeValue::SpecVersion(SpecVersion::V03), - )), + 0 => Some(("specversion", AttributeValue::SpecVersion(SpecVersion::V03))), 1 => Some(("id", AttributeValue::String(&self.attributes.id))), 2 => Some(("type", AttributeValue::String(&self.attributes.ty))), - 3 => Some(( - "source", - AttributeValue::URIRef(&self.attributes.source), - )), + 3 => Some(("source", AttributeValue::URIRef(&self.attributes.source))), 4 => self .attributes .datacontenttype @@ -142,17 +131,11 @@ impl AttributesWriter for Attributes { std::mem::replace(&mut self.ty, ty.into()) } - fn set_subject( - &mut self, - subject: Option>, - ) -> Option { + fn set_subject(&mut self, subject: Option>) -> Option { std::mem::replace(&mut self.subject, subject.map(Into::into)) } - fn set_time( - &mut self, - time: Option>>, - ) -> Option> { + fn set_time(&mut self, time: Option>>) -> Option> { std::mem::replace(&mut self.time, time.map(Into::into)) } @@ -160,16 +143,10 @@ impl AttributesWriter for Attributes { &mut self, datacontenttype: Option>, ) -> Option { - std::mem::replace( - &mut self.datacontenttype, - datacontenttype.map(Into::into), - ) + std::mem::replace(&mut self.datacontenttype, datacontenttype.map(Into::into)) } - fn set_dataschema( - &mut self, - dataschema: Option>, - ) -> Option { + fn set_dataschema(&mut self, dataschema: Option>) -> Option { std::mem::replace(&mut self.schemaurl, dataschema.map(Into::into)) } } @@ -211,14 +188,9 @@ impl crate::event::message::AttributesDeserializer for super::Attributes { self, mut visitor: V, ) -> crate::message::Result { - visitor = visitor - .set_attribute("id", MessageAttributeValue::String(self.id))?; - visitor = visitor - .set_attribute("type", MessageAttributeValue::String(self.ty))?; - visitor = visitor.set_attribute( - "source", - MessageAttributeValue::UriRef(self.source), - )?; + visitor = visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; + visitor = visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; + visitor = visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; if self.datacontenttype.is_some() { visitor = visitor.set_attribute( "datacontenttype", @@ -238,10 +210,8 @@ impl crate::event::message::AttributesDeserializer for super::Attributes { )?; } if self.time.is_some() { - visitor = visitor.set_attribute( - "time", - MessageAttributeValue::DateTime(self.time.unwrap()), - )?; + visitor = visitor + .set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; } Ok(visitor) } diff --git a/src/event/v03/format.rs b/src/event/v03/format.rs index b7990ba0..0d1a986a 100644 --- a/src/event/v03/format.rs +++ b/src/event/v03/format.rs @@ -1,8 +1,7 @@ use super::Attributes; use crate::event::data::is_json_content_type; use crate::event::format::{ - parse_data_base64, parse_data_base64_json, parse_data_json, - parse_data_string, + parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string, }; use crate::event::{Data, ExtensionValue}; use base64::prelude::*; @@ -24,29 +23,14 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { id: extract_field!(map, "id", String, E)?, ty: extract_field!(map, "type", String, E)?, source: extract_field!(map, "source", String, E)?, - datacontenttype: extract_optional_field!( - map, - "datacontenttype", - String, - E - )?, - schemaurl: extract_optional_field!( - map, - "schemaurl", - String, - E, - |s: String| { Url::parse(&s) } - )?, + datacontenttype: extract_optional_field!(map, "datacontenttype", String, E)?, + schemaurl: extract_optional_field!(map, "schemaurl", String, E, |s: String| { + Url::parse(&s) + })?, subject: extract_optional_field!(map, "subject", String, E)?, - time: extract_optional_field!( - map, - "time", - String, - E, - |s: String| { - DateTime::parse_from_rfc3339(&s).map(DateTime::::from) - } - )?, + time: extract_optional_field!(map, "time", String, E, |s: String| { + DateTime::parse_from_rfc3339(&s).map(DateTime::::from) + })?, })) } @@ -66,12 +50,8 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { Ok(match (data, is_base64, is_json) { (Some(d), false, true) => Some(Data::Json(parse_data_json(d)?)), - (Some(d), false, false) => { - Some(Data::String(parse_data_string(d)?)) - } - (Some(d), true, true) => { - Some(Data::Json(parse_data_base64_json(d)?)) - } + (Some(d), false, false) => Some(Data::String(parse_data_string(d)?)), + (Some(d), true, true) => Some(Data::Json(parse_data_base64_json(d)?)), (Some(d), true, false) => Some(Data::Binary(parse_data_base64(d)?)), (None, _, _) => None, }) @@ -80,8 +60,7 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { pub(crate) struct EventFormatSerializer {} -impl - crate::event::format::EventFormatSerializer +impl crate::event::format::EventFormatSerializer for EventFormatSerializer { fn serialize( diff --git a/src/event/v10/attributes.rs b/src/event/v10/attributes.rs index aa23fed5..49f4041f 100644 --- a/src/event/v10/attributes.rs +++ b/src/event/v10/attributes.rs @@ -1,10 +1,5 @@ -use crate::event::attributes::{ - default_hostname, AttributeValue, AttributesConverter, -}; -use crate::event::{ - AttributesReader, AttributesV03, AttributesWriter, SpecVersion, - UriReference, -}; +use crate::event::attributes::{default_hostname, AttributeValue, AttributesConverter}; +use crate::event::{AttributesReader, AttributesV03, AttributesWriter, SpecVersion, UriReference}; use crate::message::{BinarySerializer, MessageAttributeValue}; use chrono::{DateTime, Utc}; use core::fmt::Debug; @@ -56,16 +51,10 @@ impl<'a> Iterator for AttributesIntoIterator<'a> { type Item = (&'a str, AttributeValue<'a>); fn next(&mut self) -> Option { let result = match self.index { - 0 => Some(( - "specversion", - AttributeValue::SpecVersion(SpecVersion::V10), - )), + 0 => Some(("specversion", AttributeValue::SpecVersion(SpecVersion::V10))), 1 => Some(("id", AttributeValue::String(&self.attributes.id))), 2 => Some(("type", AttributeValue::String(&self.attributes.ty))), - 3 => Some(( - "source", - AttributeValue::URIRef(&self.attributes.source), - )), + 3 => Some(("source", AttributeValue::URIRef(&self.attributes.source))), 4 => self .attributes .datacontenttype @@ -143,17 +132,11 @@ impl AttributesWriter for Attributes { std::mem::replace(&mut self.ty, ty.into()) } - fn set_subject( - &mut self, - subject: Option>, - ) -> Option { + fn set_subject(&mut self, subject: Option>) -> Option { std::mem::replace(&mut self.subject, subject.map(Into::into)) } - fn set_time( - &mut self, - time: Option>>, - ) -> Option> { + fn set_time(&mut self, time: Option>>) -> Option> { std::mem::replace(&mut self.time, time.map(Into::into)) } @@ -161,16 +144,10 @@ impl AttributesWriter for Attributes { &mut self, datacontenttype: Option>, ) -> Option { - std::mem::replace( - &mut self.datacontenttype, - datacontenttype.map(Into::into), - ) + std::mem::replace(&mut self.datacontenttype, datacontenttype.map(Into::into)) } - fn set_dataschema( - &mut self, - dataschema: Option>, - ) -> Option { + fn set_dataschema(&mut self, dataschema: Option>) -> Option { std::mem::replace(&mut self.dataschema, dataschema.map(Into::into)) } } @@ -194,14 +171,9 @@ impl crate::event::message::AttributesDeserializer for super::Attributes { self, mut visitor: V, ) -> crate::message::Result { - visitor = visitor - .set_attribute("id", MessageAttributeValue::String(self.id))?; - visitor = visitor - .set_attribute("type", MessageAttributeValue::String(self.ty))?; - visitor = visitor.set_attribute( - "source", - MessageAttributeValue::UriRef(self.source), - )?; + visitor = visitor.set_attribute("id", MessageAttributeValue::String(self.id))?; + visitor = visitor.set_attribute("type", MessageAttributeValue::String(self.ty))?; + visitor = visitor.set_attribute("source", MessageAttributeValue::UriRef(self.source))?; if self.datacontenttype.is_some() { visitor = visitor.set_attribute( "datacontenttype", @@ -221,10 +193,8 @@ impl crate::event::message::AttributesDeserializer for super::Attributes { )?; } if self.time.is_some() { - visitor = visitor.set_attribute( - "time", - MessageAttributeValue::DateTime(self.time.unwrap()), - )?; + visitor = visitor + .set_attribute("time", MessageAttributeValue::DateTime(self.time.unwrap()))?; } Ok(visitor) } diff --git a/src/event/v10/format.rs b/src/event/v10/format.rs index 39355bb7..f54682ba 100644 --- a/src/event/v10/format.rs +++ b/src/event/v10/format.rs @@ -1,8 +1,7 @@ use super::Attributes; use crate::event::data::is_json_content_type; use crate::event::format::{ - parse_data_base64, parse_data_base64_json, parse_data_json, - parse_data_string, + parse_data_base64, parse_data_base64_json, parse_data_json, parse_data_string, }; use crate::event::{Data, ExtensionValue}; use base64::prelude::*; @@ -24,29 +23,14 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { id: extract_field!(map, "id", String, E)?, ty: extract_field!(map, "type", String, E)?, source: extract_field!(map, "source", String, E)?, - datacontenttype: extract_optional_field!( - map, - "datacontenttype", - String, - E - )?, - dataschema: extract_optional_field!( - map, - "dataschema", - String, - E, - |s: String| { Url::parse(&s) } - )?, + datacontenttype: extract_optional_field!(map, "datacontenttype", String, E)?, + dataschema: extract_optional_field!(map, "dataschema", String, E, |s: String| { + Url::parse(&s) + })?, subject: extract_optional_field!(map, "subject", String, E)?, - time: extract_optional_field!( - map, - "time", - String, - E, - |s: String| { - DateTime::parse_from_rfc3339(&s).map(DateTime::::from) - } - )?, + time: extract_optional_field!(map, "time", String, E, |s: String| { + DateTime::parse_from_rfc3339(&s).map(DateTime::::from) + })?, })) } @@ -62,17 +46,13 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { Ok(match (data, data_base64, is_json) { (Some(d), None, true) => Some(Data::Json(parse_data_json(d)?)), (Some(d), None, false) => Some(Data::String(parse_data_string(d)?)), - (None, Some(d), true) => { - match parse_data_base64_json::(d.to_owned()) { - Ok(x) => Some(Data::Json(x)), - Err(_) => Some(Data::Binary(parse_data_base64(d)?)), - } - } + (None, Some(d), true) => match parse_data_base64_json::(d.to_owned()) { + Ok(x) => Some(Data::Json(x)), + Err(_) => Some(Data::Binary(parse_data_base64(d)?)), + }, (None, Some(d), false) => Some(Data::Binary(parse_data_base64(d)?)), (Some(_), Some(_), _) => { - return Err(E::custom( - "Cannot have both data and data_base64 field", - )) + return Err(E::custom("Cannot have both data and data_base64 field")) } (None, None, _) => None, }) @@ -81,8 +61,7 @@ impl crate::event::format::EventFormatDeserializer for EventFormatDeserializer { pub(crate) struct EventFormatSerializer {} -impl - crate::event::format::EventFormatSerializer +impl crate::event::format::EventFormatSerializer for EventFormatSerializer { fn serialize( @@ -124,8 +103,9 @@ impl match data { Some(Data::Json(j)) => state.serialize_entry("data", j)?, Some(Data::String(s)) => state.serialize_entry("data", s)?, - Some(Data::Binary(v)) => state - .serialize_entry("data_base64", &BASE64_STANDARD.encode(v))?, + Some(Data::Binary(v)) => { + state.serialize_entry("data_base64", &BASE64_STANDARD.encode(v))? + } _ => (), }; for (k, v) in extensions { diff --git a/src/lib.rs b/src/lib.rs index c8f2e262..d0a5dcc6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -54,7 +54,7 @@ //! [Extractors]: https://actix.rs/docs/extractors/ //! [Responders]: https://actix.rs/docs/handlers/ -#![doc(html_root_url = "https://docs.rs/cloudevents-sdk/0.7.0")] +#![doc(html_root_url = "https://docs.rs/cloudevents-sdk/0.8.0")] #![deny(rustdoc::broken_intra_doc_links)] #![cfg_attr(docsrs, feature(doc_cfg))] // Show feature gate in doc