1use 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#[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#[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}