actix_web_lab/
msgpack.rs

1//! MessagePack responder.
2
3use std::sync::LazyLock;
4
5use actix_web::{HttpRequest, HttpResponse, Responder};
6use bytes::Bytes;
7use derive_more::Display;
8use mime::Mime;
9use serde::Serialize;
10
11static MSGPACK_MIME: LazyLock<Mime> = LazyLock::new(|| "application/msgpack".parse().unwrap());
12
13/// [MessagePack] responder.
14///
15/// If you require the fields to be named, use [`MessagePackNamed`].
16///
17/// [MessagePack]: https://msgpack.org/
18#[derive(Debug, Display)]
19pub struct MessagePack<T>(pub T);
20
21impl_more::impl_deref_and_mut!(<T> in MessagePack<T> => T);
22
23impl<T: Serialize> Responder for MessagePack<T> {
24    type Body = Bytes;
25
26    fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
27        let body = Bytes::from(rmp_serde::to_vec(&self.0).unwrap());
28
29        HttpResponse::Ok()
30            .content_type(MSGPACK_MIME.clone())
31            .message_body(body)
32            .unwrap()
33    }
34}
35
36/// MessagePack responder with named fields.
37#[derive(Debug, Display)]
38pub struct MessagePackNamed<T>(pub T);
39
40impl_more::impl_deref_and_mut!(<T> in MessagePackNamed<T> => T);
41
42impl<T: Serialize> Responder for MessagePackNamed<T> {
43    type Body = Bytes;
44
45    fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
46        let body = Bytes::from(rmp_serde::to_vec_named(&self.0).unwrap());
47
48        HttpResponse::Ok()
49            .content_type(MSGPACK_MIME.clone())
50            .message_body(body)
51            .unwrap()
52    }
53}