conjure_http/server/
encoding.rs1pub use crate::encoding::*;
17use conjure_serde::{json, smile};
18use erased_serde::{Deserializer, Serializer};
19use http::HeaderValue;
20
21pub struct JsonEncoding;
23
24impl Encoding for JsonEncoding {
25 fn content_type(&self) -> HeaderValue {
26 HeaderValue::from_static("application/json")
27 }
28
29 fn serializer<'a>(&self, w: &'a mut Vec<u8>) -> Box<dyn SerializerState<'a> + 'a> {
30 Box::new(JsonSerializerState {
31 serializer: json::Serializer::new(w),
32 })
33 }
34
35 fn deserializer<'a>(&self, buf: &'a [u8]) -> Box<dyn DeserializerState<'a> + 'a> {
36 Box::new(JsonDeserializerState {
37 deserializer: json::ServerDeserializer::from_slice(buf),
38 })
39 }
40}
41
42struct JsonSerializerState<'a> {
43 serializer: json::Serializer<&'a mut Vec<u8>>,
44}
45
46impl<'a> SerializerState<'a> for JsonSerializerState<'a> {
47 fn serializer<'b, 'c>(&'b mut self) -> Box<dyn Serializer + 'c>
48 where
49 'a: 'c,
50 'b: 'c,
51 {
52 Box::new(<dyn Serializer>::erase(&mut self.serializer))
53 }
54}
55
56struct JsonDeserializerState<'de> {
57 deserializer: json::ServerDeserializer<json::SliceRead<'de>>,
58}
59
60impl<'de> DeserializerState<'de> for JsonDeserializerState<'de> {
61 fn deserializer<'a>(&'a mut self) -> Box<dyn Deserializer<'de> + 'a> {
62 Box::new(<dyn Deserializer>::erase(&mut self.deserializer))
63 }
64}
65
66pub struct SmileEncoding;
68
69impl Encoding for SmileEncoding {
70 fn content_type(&self) -> HeaderValue {
71 HeaderValue::from_static("application/x-jackson-smile")
72 }
73
74 fn serializer<'a>(&self, w: &'a mut Vec<u8>) -> Box<dyn SerializerState<'a> + 'a> {
75 Box::new(SmileSerializerState {
76 serializer: smile::Serializer::new(w),
77 })
78 }
79
80 fn deserializer<'a>(&self, buf: &'a [u8]) -> Box<dyn DeserializerState<'a> + 'a> {
81 Box::new(SmileDeserializerState {
82 deserializer: smile::ServerDeserializer::from_slice(buf),
83 })
84 }
85}
86
87struct SmileSerializerState<'a> {
88 serializer: smile::Serializer<&'a mut Vec<u8>>,
89}
90
91impl<'a> SerializerState<'a> for SmileSerializerState<'a> {
92 fn serializer<'b, 'c>(&'b mut self) -> Box<dyn Serializer + 'c>
93 where
94 'a: 'c,
95 'b: 'c,
96 {
97 Box::new(<dyn Serializer>::erase(&mut self.serializer))
98 }
99}
100
101struct SmileDeserializerState<'de> {
102 deserializer: smile::ServerDeserializer<'de, smile::SliceRead<'de>>,
103}
104
105impl<'de> DeserializerState<'de> for SmileDeserializerState<'de> {
106 fn deserializer<'a>(&'a mut self) -> Box<dyn Deserializer<'de> + 'a> {
107 Box::new(<dyn Deserializer>::erase(&mut self.deserializer))
108 }
109}