Share macro between actix and warp, eliminating actix header mod
Signed-off-by: Jim Crossley <jim@crossleys.org>
This commit is contained in:
parent
13a1af1302
commit
be37a346f4
|
|
@ -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"]
|
||||||
|
|
|
||||||
|
|
@ -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),
|
|
||||||
}
|
|
||||||
})
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue