conjure_http/client/
encoding.rs

1// Copyright 2025 Palantir Technologies, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use crate::encoding::{DeserializerState, Encoding, SerializerState};
16use conjure_serde::{json, smile};
17use erased_serde::{Deserializer, Serializer};
18use http::HeaderValue;
19
20/// An [`Encoding`] using [`conjure_serde::json`](module@conjure_serde::json).
21pub 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
65/// An [`Encoding`] using [`conjure_serde::smile`](module@conjure_serde::smile).
66pub 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}