conjure_http/server/
encoding.rsuse conjure_serde::{json, smile};
use erased_serde::{Deserializer, Serializer};
use http::HeaderValue;
pub trait Encoding {
fn content_type(&self) -> HeaderValue;
fn serializer<'a>(&self, w: &'a mut Vec<u8>) -> Box<dyn SerializerState<'a> + 'a>;
fn deserializer<'a>(&self, buf: &'a [u8]) -> Box<dyn DeserializerState<'a> + 'a>;
}
pub trait SerializerState<'a> {
fn serializer<'b, 'c>(&'b mut self) -> Box<dyn Serializer + 'c>
where
'a: 'c,
'b: 'c;
}
pub trait DeserializerState<'de> {
fn deserializer<'a>(&'a mut self) -> Box<dyn Deserializer<'de> + 'a>;
}
pub struct JsonEncoding;
impl Encoding for JsonEncoding {
fn content_type(&self) -> HeaderValue {
HeaderValue::from_static("application/json")
}
fn serializer<'a>(&self, w: &'a mut Vec<u8>) -> Box<dyn SerializerState<'a> + 'a> {
Box::new(JsonSerializerState {
serializer: json::Serializer::new(w),
})
}
fn deserializer<'a>(&self, buf: &'a [u8]) -> Box<dyn DeserializerState<'a> + 'a> {
Box::new(JsonDeserializerState {
deserializer: json::ServerDeserializer::from_slice(buf),
})
}
}
struct JsonSerializerState<'a> {
serializer: json::Serializer<&'a mut Vec<u8>>,
}
impl<'a> SerializerState<'a> for JsonSerializerState<'a> {
fn serializer<'b, 'c>(&'b mut self) -> Box<dyn Serializer + 'c>
where
'a: 'c,
'b: 'c,
{
Box::new(<dyn Serializer>::erase(&mut self.serializer))
}
}
struct JsonDeserializerState<'de> {
deserializer: json::ServerDeserializer<json::SliceRead<'de>>,
}
impl<'de> DeserializerState<'de> for JsonDeserializerState<'de> {
fn deserializer<'a>(&'a mut self) -> Box<dyn Deserializer<'de> + 'a> {
Box::new(<dyn Deserializer>::erase(&mut self.deserializer))
}
}
pub struct SmileEncoding;
impl Encoding for SmileEncoding {
fn content_type(&self) -> HeaderValue {
HeaderValue::from_static("application/x-jackson-smile")
}
fn serializer<'a>(&self, w: &'a mut Vec<u8>) -> Box<dyn SerializerState<'a> + 'a> {
Box::new(SmileSerializerState {
serializer: smile::Serializer::new(w),
})
}
fn deserializer<'a>(&self, buf: &'a [u8]) -> Box<dyn DeserializerState<'a> + 'a> {
Box::new(SmileDeserializerState {
deserializer: smile::ServerDeserializer::from_slice(buf),
})
}
}
struct SmileSerializerState<'a> {
serializer: smile::Serializer<&'a mut Vec<u8>>,
}
impl<'a> SerializerState<'a> for SmileSerializerState<'a> {
fn serializer<'b, 'c>(&'b mut self) -> Box<dyn Serializer + 'c>
where
'a: 'c,
'b: 'c,
{
Box::new(<dyn Serializer>::erase(&mut self.serializer))
}
}
struct SmileDeserializerState<'de> {
deserializer: smile::ServerDeserializer<'de, smile::SliceRead<'de>>,
}
impl<'de> DeserializerState<'de> for SmileDeserializerState<'de> {
fn deserializer<'a>(&'a mut self) -> Box<dyn Deserializer<'de> + 'a> {
Box::new(<dyn Deserializer>::erase(&mut self.deserializer))
}
}