cloudevents/binding/http/
mod.rs

1pub mod builder;
2pub mod deserializer;
3mod headers;
4
5use crate::{
6    message::{Error, MessageDeserializer},
7    Event,
8};
9use deserializer::Deserializer;
10pub use headers::Headers;
11mod serializer;
12
13pub use builder::Builder;
14use core::convert::TryFrom;
15use http::Response;
16
17use http;
18pub use serializer::Serializer;
19use std::convert::TryInto;
20use std::fmt::Debug;
21
22pub static SPEC_VERSION_HEADER: &str = "ce-specversion";
23
24/// Turn a pile of HTTP headers and a body into a CloudEvent
25pub fn to_event<'a, T: Headers<'a>>(
26    headers: &'a T,
27    body: Vec<u8>,
28) -> std::result::Result<Event, Error> {
29    MessageDeserializer::into_event(Deserializer::new(headers, body))
30}
31
32pub fn header_prefix(name: &str) -> String {
33    super::header_prefix("ce-", name)
34}
35
36impl<T> TryFrom<Response<T>> for Event
37where
38    T: TryInto<Vec<u8>>,
39    <T as TryInto<Vec<u8>>>::Error: Debug,
40{
41    type Error = crate::message::Error;
42
43    fn try_from(response: Response<T>) -> Result<Self, Self::Error> {
44        let headers = response.headers().to_owned();
45        let body = T::try_into(response.into_body()).unwrap();
46
47        to_event(&headers, body)
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use crate::test::fixtures;
54    use crate::Event;
55    use core::convert::TryFrom;
56    use http::Response;
57
58    use http;
59
60    #[test]
61    fn test_response_to_event() {
62        let event = fixtures::v10::minimal_string_extension();
63
64        let response = Response::builder()
65            .header("ce-id", fixtures::id())
66            .header("ce-source", fixtures::source())
67            .header("ce-type", fixtures::ty())
68            .header("ce-specversion", "1.0")
69            .header("ce-someint", "10")
70            .body(Vec::new())
71            .unwrap();
72
73        assert_eq!(event, Event::try_from(response).unwrap());
74    }
75}