Share macro between actix and warp, eliminating actix header mod

Signed-off-by: Jim Crossley <jim@crossleys.org>
This commit is contained in:
Jim Crossley 2021-07-14 18:28:26 -04:00
parent 13a1af1302
commit be37a346f4
8 changed files with 57 additions and 66 deletions

View File

@ -17,7 +17,7 @@ categories = ["web-programming", "encoding", "data-structures"]
name = "cloudevents" name = "cloudevents"
[features] [features]
actix = ["actix-web", "async-trait", "bytes", "futures"] actix = ["actix-web", "async-trait", "bytes", "futures", "http"]
reqwest = ["reqwest-lib", "async-trait", "bytes"] reqwest = ["reqwest-lib", "async-trait", "bytes"]
rdkafka = ["rdkafka-lib", "bytes", "futures"] rdkafka = ["rdkafka-lib", "bytes", "futures"]
warp = ["warp-lib", "bytes", "http", "hyper"] warp = ["warp-lib", "bytes", "http", "hyper"]

View File

@ -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),
}
})
};
}

View File

@ -41,8 +41,6 @@
#![deny(broken_intra_doc_links)] #![deny(broken_intra_doc_links)]
#[macro_use]
mod headers;
mod server_request; mod server_request;
mod server_response; mod server_response;

View File

@ -1,15 +1,17 @@
use crate::binding::{
attribute_header,
http::{PREFIX, SPEC_VERSION_HEADER},
CLOUDEVENTS_JSON_HEADER,
};
use crate::event::SpecVersion; use crate::event::SpecVersion;
use crate::message::{ use crate::message::{
BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer, BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer,
}; };
use crate::Event; 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::dev::HttpResponseBuilder;
use actix_web::http::{HeaderValue, StatusCode}; use actix_web::http::StatusCode;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use async_trait::async_trait; use async_trait::async_trait;
use futures::future::LocalBoxFuture; use futures::future::LocalBoxFuture;
@ -34,18 +36,14 @@ impl BinarySerializer<HttpResponse> for HttpResponseSerializer {
} }
fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
self.builder.set_header( self.builder
&attribute_header(PREFIX, name), .set_header(&header_prefix(name), str_to_header_value!(value)?);
str_to_header_value!(value)?,
);
Ok(self) Ok(self)
} }
fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
self.builder.set_header( self.builder
&attribute_header(PREFIX, name), .set_header(&header_prefix(name), str_to_header_value!(value)?);
str_to_header_value!(value)?,
);
Ok(self) Ok(self)
} }

View File

@ -12,18 +12,35 @@ pub mod warp;
#[cfg(feature = "rdkafka")] #[cfg(feature = "rdkafka")]
pub(crate) mod kafka { pub(crate) mod kafka {
pub static SPEC_VERSION_HEADER: &str = "ce_specversion"; 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"))] #[cfg(any(feature = "actix", feature = "warp", feature = "reqwest"))]
pub(crate) mod http { pub(crate) mod http {
pub static SPEC_VERSION_HEADER: &str = "ce-specversion"; 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 CLOUDEVENTS_JSON_HEADER: &str = "application/cloudevents+json";
pub(crate) static CONTENT_TYPE: &str = "content-type"; 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" { if name == "datacontenttype" {
CONTENT_TYPE.to_string() CONTENT_TYPE.to_string()
} else { } else {

View File

@ -1,8 +1,8 @@
use rdkafka_lib as rdkafka; use rdkafka_lib as rdkafka;
use crate::binding::kafka::PREFIX;
use crate::binding::{ 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::event::SpecVersion;
use crate::message::{ use crate::message::{
@ -51,13 +51,13 @@ impl BinarySerializer<MessageRecord> for MessageRecord {
} }
fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
let key = &attribute_header(PREFIX, name); let key = &header_prefix(name);
self.headers = self.headers.add(key, &value.to_string()); self.headers = self.headers.add(key, &value.to_string());
Ok(self) Ok(self)
} }
fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
let key = &attribute_header(PREFIX, name); let key = &header_prefix(name);
self.headers = self.headers.add(key, &value.to_string()); self.headers = self.headers.add(key, &value.to_string());
Ok(self) Ok(self)
} }

View File

@ -1,7 +1,9 @@
use reqwest_lib as reqwest; use reqwest_lib as reqwest;
use crate::binding::http::PREFIX; use crate::binding::{
use crate::binding::{attribute_header, http::SPEC_VERSION_HEADER, CLOUDEVENTS_JSON_HEADER}; http::{header_prefix, SPEC_VERSION_HEADER},
CLOUDEVENTS_JSON_HEADER,
};
use crate::event::SpecVersion; use crate::event::SpecVersion;
use crate::message::{ use crate::message::{
BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer, BinaryDeserializer, BinarySerializer, MessageAttributeValue, Result, StructuredSerializer,
@ -27,13 +29,13 @@ impl BinarySerializer<RequestBuilder> for RequestSerializer {
} }
fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
let key = &attribute_header(PREFIX, name); let key = &header_prefix(name);
self.req = self.req.header(key, value.to_string()); self.req = self.req.header(key, value.to_string());
Ok(self) Ok(self)
} }
fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
let key = &attribute_header(PREFIX, name); let key = &header_prefix(name);
self.req = self.req.header(key, value.to_string()); self.req = self.req.header(key, value.to_string());
Ok(self) Ok(self)
} }

View File

@ -1,20 +1,20 @@
use warp_lib as warp; use warp_lib as warp;
use crate::binding::http::PREFIX; use crate::binding::{
use crate::binding::{attribute_header, http::SPEC_VERSION_HEADER, CLOUDEVENTS_JSON_HEADER}; http::{header_prefix, SPEC_VERSION_HEADER},
CLOUDEVENTS_JSON_HEADER,
};
use crate::event::SpecVersion; use crate::event::SpecVersion;
use crate::message::{ use crate::message::{
BinaryDeserializer, BinarySerializer, Error, MessageAttributeValue, Result, BinaryDeserializer, BinarySerializer, Error, MessageAttributeValue, Result,
StructuredSerializer, StructuredSerializer,
}; };
use crate::Event; use crate::{str_to_header_value, Event};
use warp::http::HeaderValue;
use warp::hyper::Body; use warp::hyper::Body;
use warp::reply::Response; use warp::reply::Response;
use http::response::Builder; use http::response::Builder;
use std::convert::TryFrom;
pub struct ResponseSerializer { pub struct ResponseSerializer {
builder: Builder, builder: Builder,
@ -30,38 +30,23 @@ impl ResponseSerializer {
impl BinarySerializer<Response> for ResponseSerializer { impl BinarySerializer<Response> for ResponseSerializer {
fn set_spec_version(mut self, spec_version: SpecVersion) -> Result<Self> { fn set_spec_version(mut self, spec_version: SpecVersion) -> Result<Self> {
self.builder = self.builder.header( self.builder = self
SPEC_VERSION_HEADER, .builder
HeaderValue::try_from(spec_version.to_string()).map_err(|e| { .header(SPEC_VERSION_HEADER, str_to_header_value!(spec_version)?);
crate::message::Error::Other {
source: Box::new(e),
}
})?,
);
Ok(self) Ok(self)
} }
fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_attribute(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
self.builder = self.builder.header( self.builder = self
&attribute_header(PREFIX, name), .builder
HeaderValue::try_from(&value.to_string()).map_err(|e| { .header(&header_prefix(name), str_to_header_value!(value)?);
crate::message::Error::Other {
source: Box::new(e),
}
})?,
);
Ok(self) Ok(self)
} }
fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> { fn set_extension(mut self, name: &str, value: MessageAttributeValue) -> Result<Self> {
self.builder = self.builder.header( self.builder = self
&attribute_header(PREFIX, name), .builder
HeaderValue::try_from(&value.to_string()).map_err(|e| { .header(&header_prefix(name), str_to_header_value!(value)?);
crate::message::Error::Other {
source: Box::new(e),
}
})?,
);
Ok(self) Ok(self)
} }