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