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