cloudevents/binding/http/builder/
adapter.rs

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