diff --git a/Cargo.toml b/Cargo.toml index 147f9a1..c3c1a3a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ categories = ["web-programming", "encoding", "data-structures"] name = "cloudevents" [features] -actix = ["actix-web", "async-trait", "bytes", "futures"] +actix = ["actix-web", "async-trait", "bytes", "futures", "http"] reqwest = ["reqwest-lib", "async-trait", "bytes"] rdkafka = ["rdkafka-lib", "bytes", "futures"] warp = ["warp-lib", "bytes", "http", "hyper"] diff --git a/src/binding/actix/headers.rs b/src/binding/actix/headers.rs deleted file mode 100644 index 867aeec..0000000 --- a/src/binding/actix/headers.rs +++ /dev/null @@ -1,9 +0,0 @@ -macro_rules! str_to_header_value { - ($header_value:expr) => { - HeaderValue::from_str(&$header_value.to_string()).map_err(|e| { - crate::message::Error::Other { - source: Box::new(e), - } - }) - }; -} diff --git a/src/binding/actix/mod.rs b/src/binding/actix/mod.rs index 85039f3..8e33852 100644 --- a/src/binding/actix/mod.rs +++ b/src/binding/actix/mod.rs @@ -41,8 +41,6 @@ #![deny(broken_intra_doc_links)] -#[macro_use] -mod headers; mod server_request; mod server_response; diff --git a/src/binding/actix/server_response.rs b/src/binding/actix/server_response.rs index 39217e4..623e039 100644 --- a/src/binding/actix/server_response.rs +++ b/src/binding/actix/server_response.rs @@ -1,15 +1,17 @@ -use crate::binding::{ - attribute_header, - http::{PREFIX, SPEC_VERSION_HEADER}, - CLOUDEVENTS_JSON_HEADER, -}; use crate::event::SpecVersion; use crate::message::{ BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer, }; use crate::Event; +use crate::{ + binding::{ + http::{header_prefix, SPEC_VERSION_HEADER}, + CLOUDEVENTS_JSON_HEADER, + }, + str_to_header_value, +}; use actix_web::dev::HttpResponseBuilder; -use actix_web::http::{HeaderValue, StatusCode}; +use actix_web::http::StatusCode; use actix_web::HttpResponse; use async_trait::async_trait; use futures::future::LocalBoxFuture; @@ -34,18 +36,14 @@ impl BinarySerializer for HttpResponseSerializer { } fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { - self.builder.set_header( - &attribute_header(PREFIX, name), - str_to_header_value!(value)?, - ); + self.builder + .set_header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) } fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { - self.builder.set_header( - &attribute_header(PREFIX, name), - str_to_header_value!(value)?, - ); + self.builder + .set_header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) } diff --git a/src/binding/mod.rs b/src/binding/mod.rs index 486907e..36c0d36 100644 --- a/src/binding/mod.rs +++ b/src/binding/mod.rs @@ -12,18 +12,35 @@ pub mod warp; #[cfg(feature = "rdkafka")] pub(crate) mod kafka { pub static SPEC_VERSION_HEADER: &str = "ce_specversion"; - pub static PREFIX: &str = "ce_"; + pub fn header_prefix(name: &str) -> String { + super::header_prefix("ce_", name) + } } + #[cfg(any(feature = "actix", feature = "warp", feature = "reqwest"))] pub(crate) mod http { pub static SPEC_VERSION_HEADER: &str = "ce-specversion"; - pub static PREFIX: &str = "ce-"; + pub fn header_prefix(name: &str) -> String { + super::header_prefix("ce-", name) + } +} + +#[cfg(any(feature = "actix", feature = "warp"))] +#[macro_export] +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 { + source: Box::new(e), + } + }) + }; } pub(crate) static CLOUDEVENTS_JSON_HEADER: &str = "application/cloudevents+json"; pub(crate) static CONTENT_TYPE: &str = "content-type"; -pub(crate) fn attribute_header(prefix: &str, name: &str) -> String { +fn header_prefix(prefix: &str, name: &str) -> String { if name == "datacontenttype" { CONTENT_TYPE.to_string() } else { diff --git a/src/binding/rdkafka/kafka_producer_record.rs b/src/binding/rdkafka/kafka_producer_record.rs index 0732395..046e953 100644 --- a/src/binding/rdkafka/kafka_producer_record.rs +++ b/src/binding/rdkafka/kafka_producer_record.rs @@ -1,8 +1,8 @@ use rdkafka_lib as rdkafka; -use crate::binding::kafka::PREFIX; use crate::binding::{ - attribute_header, kafka::SPEC_VERSION_HEADER, CLOUDEVENTS_JSON_HEADER, CONTENT_TYPE, + kafka::{header_prefix, SPEC_VERSION_HEADER}, + CLOUDEVENTS_JSON_HEADER, CONTENT_TYPE, }; use crate::event::SpecVersion; use crate::message::{ @@ -51,13 +51,13 @@ impl BinarySerializer for MessageRecord { } fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { - let key = &attribute_header(PREFIX, name); + let key = &header_prefix(name); self.headers = self.headers.add(key, &value.to_string()); Ok(self) } fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { - let key = &attribute_header(PREFIX, name); + let key = &header_prefix(name); self.headers = self.headers.add(key, &value.to_string()); Ok(self) } diff --git a/src/binding/reqwest/client_request.rs b/src/binding/reqwest/client_request.rs index 79b9a49..347a255 100644 --- a/src/binding/reqwest/client_request.rs +++ b/src/binding/reqwest/client_request.rs @@ -1,7 +1,9 @@ use reqwest_lib as reqwest; -use crate::binding::http::PREFIX; -use crate::binding::{attribute_header, http::SPEC_VERSION_HEADER, CLOUDEVENTS_JSON_HEADER}; +use crate::binding::{ + http::{header_prefix, SPEC_VERSION_HEADER}, + CLOUDEVENTS_JSON_HEADER, +}; use crate::event::SpecVersion; use crate::message::{ BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer, @@ -27,13 +29,13 @@ impl BinarySerializer for RequestSerializer { } fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { - let key = &attribute_header(PREFIX, name); + 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 { - let key = &attribute_header(PREFIX, name); + let key = &header_prefix(name); self.req = self.req.header(key, value.to_string()); Ok(self) } diff --git a/src/binding/warp/server_response.rs b/src/binding/warp/server_response.rs index 49af04e..3062234 100644 --- a/src/binding/warp/server_response.rs +++ b/src/binding/warp/server_response.rs @@ -1,20 +1,20 @@ use warp_lib as warp; -use crate::binding::http::PREFIX; -use crate::binding::{attribute_header, http::SPEC_VERSION_HEADER, CLOUDEVENTS_JSON_HEADER}; +use crate::binding::{ + http::{header_prefix, SPEC_VERSION_HEADER}, + CLOUDEVENTS_JSON_HEADER, +}; use crate::event::SpecVersion; use crate::message::{ BinaryDeserializer, BinarySerializer, Error, MessageAttributeValue, Result, StructuredSerializer, }; -use crate::Event; +use crate::{str_to_header_value, Event}; -use warp::http::HeaderValue; use warp::hyper::Body; use warp::reply::Response; use http::response::Builder; -use std::convert::TryFrom; pub struct ResponseSerializer { builder: Builder, @@ -30,38 +30,23 @@ impl ResponseSerializer { impl BinarySerializer for ResponseSerializer { fn set_spec_version(mut self, spec_version: SpecVersion) -> Result { - self.builder = self.builder.header( - SPEC_VERSION_HEADER, - HeaderValue::try_from(spec_version.to_string()).map_err(|e| { - crate::message::Error::Other { - source: Box::new(e), - } - })?, - ); + self.builder = self + .builder + .header(SPEC_VERSION_HEADER, str_to_header_value!(spec_version)?); Ok(self) } fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result { - self.builder = self.builder.header( - &attribute_header(PREFIX, name), - HeaderValue::try_from(&value.to_string()).map_err(|e| { - crate::message::Error::Other { - source: Box::new(e), - } - })?, - ); + self.builder = self + .builder + .header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) } fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result { - self.builder = self.builder.header( - &attribute_header(PREFIX, name), - HeaderValue::try_from(&value.to_string()).map_err(|e| { - crate::message::Error::Other { - source: Box::new(e), - } - })?, - ); + self.builder = self + .builder + .header(&header_prefix(name), str_to_header_value!(value)?); Ok(self) }