1use base64ct::{Base64UrlUnpadded, Encoding};
2use serde::{Serialize, ser};
3
4use crate::error::Error;
5
6pub struct Serializer {
7 pub output: String,
8}
9
10impl ser::Serializer for &mut Serializer {
11 type Ok = ();
12 type Error = Error;
13 type SerializeSeq = Self;
14 type SerializeTuple = Self;
15 type SerializeTupleStruct = Self;
16 type SerializeTupleVariant = Self;
17 type SerializeMap = Self;
18 type SerializeStruct = Self;
19 type SerializeStructVariant = Self;
20
21 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
22 let v: String = Base64UrlUnpadded::encode_string(v);
23
24 self.output += v.as_str();
25
26 Ok(())
27 }
28
29 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
30 Ok(())
31 }
32
33 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
34 where
35 T: ?Sized + Serialize,
36 {
37 value.serialize(self)
38 }
39
40 fn serialize_newtype_struct<T>(
41 self,
42 _: &'static str,
43 value: &T,
44 ) -> Result<Self::Ok, Self::Error>
45 where
46 T: ?Sized + Serialize,
47 {
48 value.serialize(self)
49 }
50
51 fn serialize_newtype_variant<T>(
52 self,
53 _: &'static str,
54 _: u32,
55 _: &'static str,
56 value: &T,
57 ) -> Result<Self::Ok, Self::Error>
58 where
59 T: ?Sized + Serialize,
60 {
61 value.serialize(self)
62 }
63
64 fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
65 Ok(self)
66 }
67
68 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
69 Ok(self)
70 }
71
72 fn serialize_tuple_struct(
73 self,
74 _: &'static str,
75 _: usize,
76 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
77 Ok(self)
78 }
79
80 fn serialize_tuple_variant(
81 self,
82 _: &'static str,
83 _: u32,
84 _: &'static str,
85 _: usize,
86 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
87 Ok(self)
88 }
89
90 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
92 self.output += v;
93
94 Ok(())
95 }
96
97 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
98 Ok(())
99 }
100
101 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
102 Err(Error::UnexpectedTypeBool)
103 }
104
105 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
106 Err(Error::UnexpectedTypeChar)
107 }
108
109 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
110 Err(Error::UnexpectedTypeFloat)
111 }
112
113 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
114 Err(Error::UnexpectedTypeFloat)
115 }
116 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
117 Err(Error::UnexpectedTypeInteger)
118 }
119
120 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
121 Err(Error::UnexpectedTypeInteger)
122 }
123
124 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
125 Err(Error::UnexpectedTypeInteger)
126 }
127
128 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
129 Err(Error::UnexpectedTypeInteger)
130 }
131
132 fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
133 Err(Error::UnableToDetermineElementOrder)
134 }
135
136 fn serialize_struct(
137 self,
138 _: &'static str,
139 _: usize,
140 ) -> Result<Self::SerializeStruct, Self::Error> {
141 Err(Error::UnableToDetermineElementOrder)
142 }
143
144 fn serialize_struct_variant(
145 self,
146 _: &'static str,
147 _: u32,
148 _: &'static str,
149 _: usize,
150 ) -> Result<Self::SerializeStructVariant, Self::Error> {
151 Err(Error::UnableToDetermineElementOrder)
152 }
153
154 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
155 Err(Error::UnexpectedTypeInteger)
156 }
157
158 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
159 Err(Error::UnexpectedTypeInteger)
160 }
161
162 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
163 Err(Error::UnexpectedTypeInteger)
164 }
165
166 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
167 Err(Error::UnexpectedTypeInteger)
168 }
169
170 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
171 Err(Error::UnexpectedEmptyType)
172 }
173
174 fn serialize_unit_variant(
175 self,
176 _: &'static str,
177 _: u32,
178 _: &'static str,
179 ) -> Result<Self::Ok, Self::Error> {
180 Err(Error::UnexpectedEmptyType)
181 }
182}
183
184impl ser::SerializeSeq for &mut Serializer {
185 type Ok = ();
186
187 type Error = Error;
188
189 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
190 where
191 T: ?Sized + Serialize,
192 {
193 if !self.output.is_empty() && !self.output.ends_with('.') {
194 self.output += ".";
195 }
196
197 value.serialize(&mut **self)
198 }
199
200 fn end(self) -> Result<Self::Ok, Self::Error> {
201 Ok(())
202 }
203}
204
205impl ser::SerializeMap for &mut Serializer {
206 type Ok = ();
207 type Error = Error;
208
209 fn end(self) -> Result<Self::Ok, Self::Error> {
210 Err(Error::UnableToDetermineElementOrder)
211 }
212
213 fn serialize_key<T>(&mut self, _: &T) -> Result<(), Self::Error>
214 where
215 T: ?Sized + Serialize,
216 {
217 Err(Error::UnableToDetermineElementOrder)
218 }
219
220 fn serialize_value<T>(&mut self, _: &T) -> Result<(), Self::Error>
221 where
222 T: ?Sized + Serialize,
223 {
224 Err(Error::UnableToDetermineElementOrder)
225 }
226}
227
228impl ser::SerializeStruct for &mut Serializer {
229 type Ok = ();
230 type Error = Error;
231
232 fn end(self) -> Result<Self::Ok, Self::Error> {
233 Err(Error::UnableToDetermineElementOrder)
234 }
235
236 fn serialize_field<T>(&mut self, _: &'static str, _: &T) -> Result<(), Self::Error>
237 where
238 T: ?Sized + Serialize,
239 {
240 Err(Error::UnableToDetermineElementOrder)
241 }
242}
243
244impl ser::SerializeStructVariant for &mut Serializer {
245 type Ok = ();
246 type Error = Error;
247
248 fn end(self) -> Result<Self::Ok, Self::Error> {
249 Err(Error::UnableToDetermineElementOrder)
250 }
251
252 fn serialize_field<T>(&mut self, _: &'static str, _: &T) -> Result<(), Self::Error>
253 where
254 T: ?Sized + Serialize,
255 {
256 Err(Error::UnableToDetermineElementOrder)
257 }
258}
259
260impl ser::SerializeTuple for &mut Serializer {
261 type Ok = ();
262
263 type Error = Error;
264
265 fn end(self) -> Result<Self::Ok, Self::Error> {
266 Ok(())
267 }
268
269 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
270 where
271 T: ?Sized + Serialize,
272 {
273 if !self.output.is_empty() && !self.output.ends_with('.') {
274 self.output += ".";
275 }
276
277 value.serialize(&mut **self)
278 }
279}
280
281impl ser::SerializeTupleStruct for &mut Serializer {
282 type Ok = ();
283 type Error = Error;
284
285 fn end(self) -> Result<Self::Ok, Self::Error> {
286 Ok(())
287 }
288
289 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
290 where
291 T: ?Sized + Serialize,
292 {
293 if !self.output.is_empty() && !self.output.ends_with('.') {
294 self.output += ".";
295 }
296
297 value.serialize(&mut **self)
298 }
299}
300
301impl ser::SerializeTupleVariant for &mut Serializer {
302 type Ok = ();
303 type Error = Error;
304
305 fn end(self) -> Result<Self::Ok, Self::Error> {
306 Ok(())
307 }
308
309 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
310 where
311 T: ?Sized + Serialize,
312 {
313 if !self.output.is_empty() && !self.output.ends_with('.') {
314 self.output += ".";
315 }
316
317 value.serialize(&mut **self)
318 }
319}