use hyper::{header::CONTENT_TYPE, Body, Response, StatusCode}; use serde::{Deserialize, Serialize}; pub fn msgpack_ok(value: T) -> Response { msgpack(value, StatusCode::OK) } pub fn msgpack(value: T, code: StatusCode) -> Response { let mut serialized = Vec::new(); let mut serializer = rmp_serde::Serializer::new(&mut serialized) .with_human_readable() .with_struct_map(); if let Err(err) = value.serialize(&mut serializer) { return Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) .header(CONTENT_TYPE, "text/plain") .body(Body::from(err.to_string())) .unwrap(); }; Response::builder() .status(code) .header(CONTENT_TYPE, "application/msgpack") .body(Body::from(serialized)) .unwrap() } pub fn serialize_msgpack(value: T) -> anyhow::Result> { let mut serialized = Vec::new(); let mut serializer = rmp_serde::Serializer::new(&mut serialized) .with_human_readable() .with_struct_map(); value.serialize(&mut serializer)?; Ok(serialized) } pub fn deserialize_msgpack<'a, T: Deserialize<'a>>( input: &'a [u8], ) -> Result { let mut deserializer = rmp_serde::Deserializer::new(input).with_human_readable(); T::deserialize(&mut deserializer) } pub fn json(value: T, code: StatusCode) -> Response { let serialized = match serde_json::to_string(&value) { Ok(v) => v, Err(err) => { return Response::builder() .status(StatusCode::INTERNAL_SERVER_ERROR) .header(CONTENT_TYPE, "text/plain") .body(Body::from(err.to_string())) .unwrap(); } }; Response::builder() .status(code) .header(CONTENT_TYPE, "application/json") .body(Body::from(serialized)) .unwrap() }