cloudevents/binding/http_0_2/builder/
adapter.rs

1use http::Response;
2use http_0_2 as http;
3use hyper::body::Body;
4use std::cell::Cell;
5
6#[cfg(not(target_os = "wasi"))]
7use hyper_0_14 as hyper;
8
9#[cfg(target_os = "wasi")]
10use hyper;
11
12use crate::binding::http_0_2::{Builder, Serializer};
13use crate::message::{BinaryDeserializer, Error, Result};
14use crate::Event;
15
16struct Adapter {
17    builder: Cell<http::response::Builder>,
18}
19
20impl Builder<Response<Body>> for Adapter {
21    fn header(&mut self, key: &str, value: http::header::HeaderValue) {
22        self.builder.set(self.builder.take().header(key, value));
23    }
24    fn body(&mut self, bytes: Vec<u8>) -> Result<Response<Body>> {
25        self.builder
26            .take()
27            .body(Body::from(bytes))
28            .map_err(|e| crate::message::Error::Other {
29                source: Box::new(e),
30            })
31    }
32    fn finish(&mut self) -> Result<Response<Body>> {
33        self.body(Vec::new())
34    }
35}
36
37pub fn to_response(event: Event) -> std::result::Result<Response<Body>, Error> {
38    BinaryDeserializer::deserialize_binary(
39        event,
40        Serializer::new(Adapter {
41            builder: Cell::new(http::Response::builder()),
42        }),
43    )
44}