use http::HeaderValue;
use mediatype::MediaType;
use super::{Borrowable, Format, OwnedDeserializer, OwnedSerializer};
const MEDIA_TYPES: &[MediaType<'_>] = &[
mediatype::media_type!(APPLICATION / MSGPACK),
mediatype::media_type!(APPLICATION / x_::MSGPACK),
];
const CONTENT_TYPE: HeaderValue = HeaderValue::from_static("application/msgpack");
#[derive(Debug, Clone, Copy, Default)]
pub struct MsgPackFormat;
impl Format for MsgPackFormat {
fn media_types(&self) -> &'static [MediaType<'static>] {
MEDIA_TYPES
}
fn content_type_header(&self) -> HeaderValue {
CONTENT_TYPE
}
fn serializer<'a>(
&'a self,
bytes: &'a mut Vec<u8>,
) -> erased_serde::Result<impl OwnedSerializer + 'a> {
Ok(rmp_serde::Serializer::new(bytes))
}
fn deserializer<'a>(
&'a self,
bytes: &'a [u8],
) -> erased_serde::Result<impl OwnedDeserializer<'a> + 'a> {
Ok(Borrowable(rmp_serde::Deserializer::from_read_ref(bytes)))
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct MsgPackNamedFormat;
impl Format for MsgPackNamedFormat {
fn media_types(&self) -> &'static [MediaType<'static>] {
MEDIA_TYPES
}
fn content_type_header(&self) -> HeaderValue {
CONTENT_TYPE
}
fn serializer<'a>(
&'a self,
bytes: &'a mut Vec<u8>,
) -> erased_serde::Result<impl OwnedSerializer + 'a> {
Ok(rmp_serde::Serializer::new(bytes).with_struct_map())
}
fn deserializer<'a>(
&'a self,
bytes: &'a [u8],
) -> erased_serde::Result<impl OwnedDeserializer<'a> + 'a> {
Ok(Borrowable(rmp_serde::Deserializer::from_read_ref(bytes)))
}
}