1#![allow(deprecated)]
2use super::EncodeError as SerdeEncodeError;
3use crate::config::Config;
4use crate::enc::Encode;
5use crate::enc::Encoder;
6use crate::enc::write::Writer;
7use crate::error::EncodeError;
8#[cfg(feature = "alloc")]
9use alloc::vec::Vec;
10use serde::ser::Serialize;
11use serde::ser::SerializeMap;
12use serde::ser::SerializeSeq;
13use serde::ser::SerializeStruct;
14use serde::ser::SerializeStructVariant;
15use serde::ser::SerializeTuple;
16use serde::ser::SerializeTupleStruct;
17use serde::ser::SerializeTupleVariant;
18use serde::ser::Serializer;
19
20#[cfg(feature = "alloc")]
30#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
31pub fn encode_to_vec<E, C>(
32 val: E,
33 config: C,
34) -> Result<Vec<u8>, EncodeError>
35where
36 E: Serialize,
37 C: Config,
38{
39 let mut encoder = crate::enc::EncoderImpl::new(crate::VecWriter::default(), config);
40 let serializer = SerdeEncoder { enc: &mut encoder };
41 val.serialize(serializer)?;
42 Ok(encoder.into_writer().collect())
43}
44
45pub fn encode_into_slice<E, C>(
55 val: E,
56 dst: &mut [u8],
57 config: C,
58) -> Result<usize, EncodeError>
59where
60 E: Serialize,
61 C: Config,
62{
63 let mut encoder =
64 crate::enc::EncoderImpl::new(crate::enc::write::SliceWriter::new(dst), config);
65 let serializer = SerdeEncoder { enc: &mut encoder };
66 val.serialize(serializer)?;
67 Ok(encoder.into_writer().bytes_written())
68}
69
70pub fn encode_into_writer<E: Serialize, W: Writer, C: Config>(
74 val: E,
75 writer: W,
76 config: C,
77) -> Result<(), EncodeError> {
78 let mut encoder = crate::enc::EncoderImpl::<_, C>::new(writer, config);
79 let serializer = SerdeEncoder { enc: &mut encoder };
80 val.serialize(serializer)?;
81 Ok(())
82}
83
84#[cfg_attr(docsrs, doc(cfg(feature = "std")))]
88#[cfg(feature = "std")]
89pub fn encode_into_std_write<E: Serialize, C: Config, W: std::io::Write>(
90 val: E,
91 dst: &mut W,
92 config: C,
93) -> Result<usize, EncodeError> {
94 let writer = crate::IoWriter::new(dst);
95 let mut encoder = crate::enc::EncoderImpl::<_, C>::new(writer, config);
96 let serializer = SerdeEncoder { enc: &mut encoder };
97 val.serialize(serializer)?;
98 Ok(encoder.into_writer().bytes_written())
99}
100
101pub(super) struct SerdeEncoder<'a, ENC: Encoder> {
102 pub(super) enc: &'a mut ENC,
103}
104
105impl<ENC> Serializer for SerdeEncoder<'_, ENC>
106where
107 ENC: Encoder,
108{
109 type Error = EncodeError;
110 type Ok = ();
111 type SerializeMap = Self;
112 type SerializeSeq = Self;
113 type SerializeStruct = Self;
114 type SerializeStructVariant = Self;
115 type SerializeTuple = Self;
116 type SerializeTupleStruct = Self;
117 type SerializeTupleVariant = Self;
118
119 serde::serde_if_integer128! {
120 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
121 v.encode(self.enc)
122 }
123 }
124
125 serde::serde_if_integer128! {
126 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
127 v.encode(self.enc)
128 }
129 }
130
131 fn serialize_bool(
132 self,
133 v: bool,
134 ) -> Result<Self::Ok, Self::Error> {
135 v.encode(self.enc)
136 }
137
138 fn serialize_i8(
139 self,
140 v: i8,
141 ) -> Result<Self::Ok, Self::Error> {
142 v.encode(self.enc)
143 }
144
145 fn serialize_i16(
146 self,
147 v: i16,
148 ) -> Result<Self::Ok, Self::Error> {
149 v.encode(self.enc)
150 }
151
152 fn serialize_i32(
153 self,
154 v: i32,
155 ) -> Result<Self::Ok, Self::Error> {
156 v.encode(self.enc)
157 }
158
159 fn serialize_i64(
160 self,
161 v: i64,
162 ) -> Result<Self::Ok, Self::Error> {
163 v.encode(self.enc)
164 }
165
166 fn serialize_u8(
167 self,
168 v: u8,
169 ) -> Result<Self::Ok, Self::Error> {
170 v.encode(self.enc)
171 }
172
173 fn serialize_u16(
174 self,
175 v: u16,
176 ) -> Result<Self::Ok, Self::Error> {
177 v.encode(self.enc)
178 }
179
180 fn serialize_u32(
181 self,
182 v: u32,
183 ) -> Result<Self::Ok, Self::Error> {
184 v.encode(self.enc)
185 }
186
187 fn serialize_u64(
188 self,
189 v: u64,
190 ) -> Result<Self::Ok, Self::Error> {
191 v.encode(self.enc)
192 }
193
194 fn serialize_f32(
195 self,
196 v: f32,
197 ) -> Result<Self::Ok, Self::Error> {
198 v.encode(self.enc)
199 }
200
201 fn serialize_f64(
202 self,
203 v: f64,
204 ) -> Result<Self::Ok, Self::Error> {
205 v.encode(self.enc)
206 }
207
208 fn serialize_char(
209 self,
210 v: char,
211 ) -> Result<Self::Ok, Self::Error> {
212 v.encode(self.enc)
213 }
214
215 fn serialize_str(
216 self,
217 v: &str,
218 ) -> Result<Self::Ok, Self::Error> {
219 v.encode(self.enc)
220 }
221
222 fn serialize_bytes(
223 self,
224 v: &[u8],
225 ) -> Result<Self::Ok, Self::Error> {
226 v.encode(self.enc)
227 }
228
229 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
230 0u8.encode(self.enc)
231 }
232
233 fn serialize_some<T>(
234 mut self,
235 value: &T,
236 ) -> Result<Self::Ok, Self::Error>
237 where
238 T: Serialize + ?Sized,
239 {
240 1u8.encode(&mut self.enc)?;
241 value.serialize(self)
242 }
243
244 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
245 Ok(())
246 }
247
248 fn serialize_unit_struct(
249 self,
250 _name: &'static str,
251 ) -> Result<Self::Ok, Self::Error> {
252 Ok(())
253 }
254
255 fn serialize_unit_variant(
256 self,
257 _name: &'static str,
258 variant_index: u32,
259 _variant: &'static str,
260 ) -> Result<Self::Ok, Self::Error> {
261 variant_index.encode(self.enc)
262 }
263
264 fn serialize_newtype_struct<T>(
265 self,
266 _name: &'static str,
267 value: &T,
268 ) -> Result<Self::Ok, Self::Error>
269 where
270 T: Serialize + ?Sized,
271 {
272 value.serialize(self)
273 }
274
275 fn serialize_newtype_variant<T>(
276 mut self,
277 _name: &'static str,
278 variant_index: u32,
279 _variant: &'static str,
280 value: &T,
281 ) -> Result<Self::Ok, Self::Error>
282 where
283 T: Serialize + ?Sized,
284 {
285 variant_index.encode(&mut self.enc)?;
286 value.serialize(self)
287 }
288
289 fn serialize_seq(
290 mut self,
291 len: Option<usize>,
292 ) -> Result<Self::SerializeSeq, Self::Error> {
293 let len = len.ok_or_else(|| SerdeEncodeError::SequenceMustHaveLength.into())?;
294 len.encode(&mut self.enc)?;
295 Ok(self)
296 }
297
298 fn serialize_tuple(
299 self,
300 _: usize,
301 ) -> Result<Self::SerializeTuple, Self::Error> {
302 Ok(self)
303 }
304
305 fn serialize_tuple_struct(
306 self,
307 _name: &'static str,
308 _len: usize,
309 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
310 Ok(self)
311 }
312
313 fn serialize_tuple_variant(
314 mut self,
315 _name: &'static str,
316 variant_index: u32,
317 _variant: &'static str,
318 _len: usize,
319 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
320 variant_index.encode(&mut self.enc)?;
321 Ok(self)
322 }
323
324 fn serialize_map(
325 mut self,
326 len: Option<usize>,
327 ) -> Result<Self::SerializeMap, Self::Error> {
328 let len = len.ok_or_else(|| SerdeEncodeError::SequenceMustHaveLength.into())?;
329 len.encode(&mut self.enc)?;
330 Ok(self)
331 }
332
333 fn serialize_struct(
334 self,
335 _name: &'static str,
336 _len: usize,
337 ) -> Result<Self::SerializeStruct, Self::Error> {
338 Ok(self)
339 }
340
341 fn serialize_struct_variant(
342 mut self,
343 _name: &'static str,
344 variant_index: u32,
345 _variant: &'static str,
346 _len: usize,
347 ) -> Result<Self::SerializeStructVariant, Self::Error> {
348 variant_index.encode(&mut self.enc)?;
349 Ok(self)
350 }
351
352 #[cfg(not(feature = "alloc"))]
353 fn collect_str<T>(
354 self,
355 _: &T,
356 ) -> Result<Self::Ok, Self::Error>
357 where
358 T: core::fmt::Display + ?Sized,
359 {
360 Err(SerdeEncodeError::CannotCollectStr.into())
361 }
362
363 fn is_human_readable(&self) -> bool {
364 false
365 }
366}
367
368type Compound<'a, ENC> = SerdeEncoder<'a, ENC>;
369
370impl<ENC: Encoder> SerializeSeq for Compound<'_, ENC> {
371 type Error = EncodeError;
372 type Ok = ();
373
374 fn serialize_element<T>(
375 &mut self,
376 value: &T,
377 ) -> Result<(), Self::Error>
378 where
379 T: Serialize + ?Sized,
380 {
381 value.serialize(SerdeEncoder { enc: self.enc })
382 }
383
384 fn end(self) -> Result<Self::Ok, Self::Error> {
385 Ok(())
386 }
387}
388
389impl<ENC: Encoder> SerializeTuple for Compound<'_, ENC> {
390 type Error = EncodeError;
391 type Ok = ();
392
393 fn serialize_element<T>(
394 &mut self,
395 value: &T,
396 ) -> Result<(), Self::Error>
397 where
398 T: Serialize + ?Sized,
399 {
400 value.serialize(SerdeEncoder { enc: self.enc })
401 }
402
403 fn end(self) -> Result<Self::Ok, Self::Error> {
404 Ok(())
405 }
406}
407
408impl<ENC: Encoder> SerializeTupleStruct for Compound<'_, ENC> {
409 type Error = EncodeError;
410 type Ok = ();
411
412 fn serialize_field<T>(
413 &mut self,
414 value: &T,
415 ) -> Result<(), Self::Error>
416 where
417 T: Serialize + ?Sized,
418 {
419 value.serialize(SerdeEncoder { enc: self.enc })
420 }
421
422 fn end(self) -> Result<Self::Ok, Self::Error> {
423 Ok(())
424 }
425}
426
427impl<ENC: Encoder> SerializeTupleVariant for Compound<'_, ENC> {
428 type Error = EncodeError;
429 type Ok = ();
430
431 fn serialize_field<T>(
432 &mut self,
433 value: &T,
434 ) -> Result<(), Self::Error>
435 where
436 T: Serialize + ?Sized,
437 {
438 value.serialize(SerdeEncoder { enc: self.enc })
439 }
440
441 fn end(self) -> Result<Self::Ok, Self::Error> {
442 Ok(())
443 }
444}
445
446impl<ENC: Encoder> SerializeMap for Compound<'_, ENC> {
447 type Error = EncodeError;
448 type Ok = ();
449
450 fn serialize_key<T>(
451 &mut self,
452 key: &T,
453 ) -> Result<(), Self::Error>
454 where
455 T: Serialize + ?Sized,
456 {
457 key.serialize(SerdeEncoder { enc: self.enc })
458 }
459
460 fn serialize_value<T>(
461 &mut self,
462 value: &T,
463 ) -> Result<(), Self::Error>
464 where
465 T: Serialize + ?Sized,
466 {
467 value.serialize(SerdeEncoder { enc: self.enc })
468 }
469
470 fn end(self) -> Result<Self::Ok, Self::Error> {
471 Ok(())
472 }
473}
474
475impl<ENC: Encoder> SerializeStruct for Compound<'_, ENC> {
476 type Error = EncodeError;
477 type Ok = ();
478
479 fn serialize_field<T>(
480 &mut self,
481 _key: &'static str,
482 value: &T,
483 ) -> Result<(), Self::Error>
484 where
485 T: Serialize + ?Sized,
486 {
487 value.serialize(SerdeEncoder { enc: self.enc })
488 }
489
490 fn end(self) -> Result<Self::Ok, Self::Error> {
491 Ok(())
492 }
493}
494
495impl<ENC: Encoder> SerializeStructVariant for Compound<'_, ENC> {
496 type Error = EncodeError;
497 type Ok = ();
498
499 fn serialize_field<T>(
500 &mut self,
501 _key: &'static str,
502 value: &T,
503 ) -> Result<(), Self::Error>
504 where
505 T: Serialize + ?Sized,
506 {
507 value.serialize(SerdeEncoder { enc: self.enc })
508 }
509
510 fn end(self) -> Result<Self::Ok, Self::Error> {
511 Ok(())
512 }
513}