conjure_http/server/
encoding.rs

1// Copyright 2024 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
15// FIXME make non-pub in 6.0
16pub use crate::encoding::*;
17use conjure_serde::{json, smile};
18use erased_serde::{Deserializer, Serializer};
19use http::HeaderValue;
20
21/// An [`Encoding`] using [`conjure_serde::json`](module@conjure_serde::json).
22pub 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
66/// An [`Encoding`] using [`conjure_serde::smile`](module@conjure_serde::smile).
67pub 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}