1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//! MessagePack responder.

use actix_web::{HttpRequest, HttpResponse, Responder};
use bytes::Bytes;
use derive_more::{Deref, DerefMut, Display};
use mime::Mime;
use once_cell::sync::Lazy;
use serde::Serialize;

static MSGPACK_MIME: Lazy<Mime> = Lazy::new(|| "application/msgpack".parse().unwrap());

/// MessagePack responder.
///
/// If you require the fields to be named, use [`MessagePackNamed`].
#[derive(Debug, Deref, DerefMut, Display)]
pub struct MessagePack<T>(pub T);

impl<T: Serialize> Responder for MessagePack<T> {
    type Body = Bytes;

    fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
        let body = Bytes::from(rmp_serde::to_vec(&self.0).unwrap());

        HttpResponse::Ok()
            .content_type(MSGPACK_MIME.clone())
            .message_body(body)
            .unwrap()
    }
}

/// MessagePack responder with named fields.
#[derive(Debug, Deref, DerefMut, Display)]
pub struct MessagePackNamed<T>(pub T);

impl<T: Serialize> Responder for MessagePackNamed<T> {
    type Body = Bytes;

    fn respond_to(self, _req: &HttpRequest) -> HttpResponse<Self::Body> {
        let body = Bytes::from(rmp_serde::to_vec_named(&self.0).unwrap());

        HttpResponse::Ok()
            .content_type(MSGPACK_MIME.clone())
            .message_body(body)
            .unwrap()
    }
}