1mod error;
36mod map;
37mod num;
38mod seq;
39pub use num::{AggressiveMinimize, Exact, LosslessMinimize, NumEncoder};
40
41use core::marker::PhantomData;
42
43pub use error::Error;
44
45use messagepack_core::{
46 Encode,
47 encode::{BinaryEncoder, MapFormatEncoder, NilEncoder, array::ArrayFormatEncoder},
48 io::{IoWrite, SliceWriter, WError},
49};
50
51use serde::ser;
52
53pub fn to_core_writer_with_config<T, W, C>(
55 value: &T,
56 writer: &mut W,
57 config: C,
58) -> Result<usize, Error<W::Error>>
59where
60 T: ser::Serialize + ?Sized,
61 W: IoWrite,
62 C: NumEncoder<W>,
63{
64 let mut ser = Serializer::new(writer, config);
65 value.serialize(&mut ser)?;
66 Ok(ser.current_length)
67}
68
69#[inline]
71pub fn to_core_writer<T, W>(value: &T, writer: &mut W) -> Result<usize, Error<W::Error>>
72where
73 T: ser::Serialize + ?Sized,
74 W: IoWrite,
75{
76 to_core_writer_with_config(value, writer, num::LosslessMinimize)
77}
78
79#[inline]
81pub fn to_slice_with_config<'a, T, C>(
82 value: &T,
83 buf: &'a mut [u8],
84 config: C,
85) -> Result<usize, Error<WError>>
86where
87 T: ser::Serialize + ?Sized,
88 C: NumEncoder<SliceWriter<'a>>,
89{
90 let mut writer = SliceWriter::new(buf);
91 to_core_writer_with_config(value, &mut writer, config)
92}
93
94#[inline]
96pub fn to_slice<T>(value: &T, buf: &mut [u8]) -> Result<usize, Error<WError>>
97where
98 T: ser::Serialize + ?Sized,
99{
100 to_slice_with_config(value, buf, num::LosslessMinimize)
101}
102
103#[cfg(feature = "alloc")]
105#[inline]
106pub fn to_vec_with_config<T, C>(
107 value: &T,
108 config: C,
109) -> Result<alloc::vec::Vec<u8>, Error<core::convert::Infallible>>
110where
111 T: ser::Serialize + ?Sized,
112 C: for<'a> NumEncoder<messagepack_core::io::VecRefWriter<'a>>,
113{
114 let mut buf = alloc::vec::Vec::new();
115 let mut writer = messagepack_core::io::VecRefWriter::new(&mut buf);
116 to_core_writer_with_config(value, &mut writer, config)?;
117 Ok(buf)
118}
119
120#[cfg(feature = "alloc")]
122#[inline]
123pub fn to_vec<T>(value: &T) -> Result<alloc::vec::Vec<u8>, Error<core::convert::Infallible>>
124where
125 T: ser::Serialize + ?Sized,
126{
127 to_vec_with_config(value, num::LosslessMinimize)
128}
129
130#[cfg(feature = "std")]
131#[inline]
133pub fn to_writer_with_config<T, W, C>(
134 value: &T,
135 writer: &mut W,
136 config: C,
137) -> Result<usize, Error<std::io::Error>>
138where
139 T: ser::Serialize + ?Sized,
140 W: std::io::Write,
141 C: NumEncoder<W>,
142{
143 to_core_writer_with_config(value, writer, config)
144}
145
146#[cfg(feature = "std")]
147#[inline]
149pub fn to_writer<T, W>(value: &T, writer: &mut W) -> Result<usize, Error<std::io::Error>>
150where
151 T: ser::Serialize + ?Sized,
152 W: std::io::Write,
153{
154 to_writer_with_config(value, writer, num::LosslessMinimize)
155}
156
157#[derive(Debug, PartialOrd, Ord, PartialEq, Eq)]
158struct Serializer<'a, W, Num> {
159 writer: &'a mut W,
160 current_length: usize,
161 num_encoder: PhantomData<Num>,
162}
163
164impl<'a, W, Num> Serializer<'a, W, Num>
165where
166 W: IoWrite,
167 Num: num::NumEncoder<W>,
168{
169 pub fn new(writer: &'a mut W, _num_encoder: Num) -> Self {
170 Self {
171 writer,
172 current_length: 0,
173 num_encoder: PhantomData,
174 }
175 }
176}
177
178impl<W, Num> AsMut<Self> for Serializer<'_, W, Num> {
179 fn as_mut(&mut self) -> &mut Self {
180 self
181 }
182}
183
184impl<'a, 'b: 'a, W, Num> ser::Serializer for &'a mut Serializer<'b, W, Num>
185where
186 W: IoWrite,
187 Num: NumEncoder<W>,
188{
189 type Ok = ();
190 type Error = Error<W::Error>;
191
192 type SerializeSeq = seq::SerializeSeq<'a, 'b, W, Num>;
193 type SerializeTuple = seq::SerializeSeq<'a, 'b, W, Num>;
194 type SerializeTupleStruct = seq::SerializeSeq<'a, 'b, W, Num>;
195 type SerializeTupleVariant = seq::SerializeSeq<'a, 'b, W, Num>;
196 type SerializeMap = map::SerializeMap<'a, 'b, W, Num>;
197 type SerializeStruct = map::SerializeMap<'a, 'b, W, Num>;
198 type SerializeStructVariant = map::SerializeMap<'a, 'b, W, Num>;
199
200 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
201 self.current_length += v.encode(self.writer)?;
202 Ok(())
203 }
204
205 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
206 self.current_length += Num::encode_i8(v, self.writer)?;
207 Ok(())
208 }
209
210 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
211 self.current_length += Num::encode_i16(v, self.writer)?;
212 Ok(())
213 }
214
215 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
216 self.current_length += Num::encode_i32(v, self.writer)?;
217 Ok(())
218 }
219
220 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
221 self.current_length += Num::encode_i64(v, self.writer)?;
222 Ok(())
223 }
224
225 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
226 self.current_length += Num::encode_i128(v, self.writer)?;
227 Ok(())
228 }
229
230 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
231 self.current_length += Num::encode_u8(v, self.writer)?;
232 Ok(())
233 }
234
235 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
236 self.current_length += Num::encode_u16(v, self.writer)?;
237 Ok(())
238 }
239
240 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
241 self.current_length += Num::encode_u32(v, self.writer)?;
242 Ok(())
243 }
244
245 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
246 self.current_length += Num::encode_u64(v, self.writer)?;
247 Ok(())
248 }
249
250 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
251 self.current_length += Num::encode_u128(v, self.writer)?;
252 Ok(())
253 }
254
255 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
256 self.current_length += Num::encode_f32(v, self.writer)?;
257 Ok(())
258 }
259
260 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
261 self.current_length += Num::encode_f64(v, self.writer)?;
262 Ok(())
263 }
264
265 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
266 let mut buf = [0u8; 4];
268 let s = v.encode_utf8(&mut buf);
269 self.serialize_str(s)
270 }
271
272 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> {
273 self.current_length += v.encode(self.writer)?;
274 Ok(())
275 }
276
277 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok, Self::Error> {
278 self.current_length += BinaryEncoder(v).encode(self.writer)?;
279 Ok(())
280 }
281
282 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
283 self.current_length += NilEncoder.encode(self.writer)?;
284 Ok(())
285 }
286
287 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
288 where
289 T: ?Sized + ser::Serialize,
290 {
291 value.serialize(self)
292 }
293
294 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
295 self.serialize_none()
296 }
297
298 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> {
299 self.serialize_unit()
300 }
301
302 fn serialize_unit_variant(
303 self,
304 _name: &'static str,
305 _variant_index: u32,
306 variant: &'static str,
307 ) -> Result<Self::Ok, Self::Error> {
308 self.serialize_str(variant)
309 }
310
311 fn serialize_newtype_struct<T>(
312 self,
313 name: &'static str,
314 value: &T,
315 ) -> Result<Self::Ok, Self::Error>
316 where
317 T: ?Sized + ser::Serialize,
318 {
319 match name {
320 crate::extension::EXTENSION_STRUCT_NAME => {
321 let mut ser = crate::extension::ser::SerializeExt::new(self.writer);
322 value.serialize(&mut ser)?;
323 self.current_length += ser.length();
324 Ok(())
325 }
326 _ => value.serialize(self.as_mut()),
327 }
328 }
329
330 fn serialize_newtype_variant<T>(
331 self,
332 _name: &'static str,
333 _variant_index: u32,
334 variant: &'static str,
335 value: &T,
336 ) -> Result<Self::Ok, Self::Error>
337 where
338 T: ?Sized + ser::Serialize,
339 {
340 self.current_length += MapFormatEncoder::new(1).encode(self.writer)?;
341 self.serialize_str(variant)?;
342 value.serialize(self.as_mut())
343 }
344
345 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
346 let len = len.ok_or(Error::SeqLenNone)?;
347 self.current_length += ArrayFormatEncoder(len).encode(self.writer)?;
348 Ok(seq::SerializeSeq::new(self))
349 }
350
351 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
352 self.serialize_seq(Some(len))
353 }
354
355 fn serialize_tuple_struct(
356 self,
357 _name: &'static str,
358 len: usize,
359 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
360 self.serialize_seq(Some(len))
361 }
362
363 fn serialize_tuple_variant(
364 self,
365 _name: &'static str,
366 _variant_index: u32,
367 variant: &'static str,
368 len: usize,
369 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
370 self.current_length += MapFormatEncoder::new(1).encode(self.writer)?;
371 self.serialize_str(variant)?;
372 self.current_length += ArrayFormatEncoder(len).encode(self.writer)?;
373 Ok(seq::SerializeSeq::new(self))
374 }
375
376 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
377 let len = len.ok_or(Error::SeqLenNone)?;
378 self.current_length += MapFormatEncoder::new(len).encode(self.writer)?;
379 Ok(map::SerializeMap::new(self))
380 }
381
382 fn serialize_struct(
383 self,
384 _name: &'static str,
385 len: usize,
386 ) -> Result<Self::SerializeStruct, Self::Error> {
387 self.current_length += MapFormatEncoder::new(len).encode(self.writer)?;
388 Ok(map::SerializeMap::new(self))
389 }
390
391 fn serialize_struct_variant(
392 self,
393 name: &'static str,
394 _variant_index: u32,
395 variant: &'static str,
396 len: usize,
397 ) -> Result<Self::SerializeStructVariant, Self::Error> {
398 self.current_length += MapFormatEncoder::new(1).encode(self.writer)?;
399 self.serialize_str(variant)?;
400 self.serialize_struct(name, len)
401 }
402
403 #[cfg(not(any(feature = "alloc", feature = "std")))]
404 fn collect_str<T>(self, _value: &T) -> Result<Self::Ok, Self::Error>
405 where
406 T: ?Sized + core::fmt::Display,
407 {
408 Err(ser::Error::custom("`collect_str` is not supported"))
409 }
410
411 fn is_human_readable(&self) -> bool {
412 false
413 }
414}
415
416#[cfg(test)]
417mod tests {
418 use serde::Serialize;
419
420 use super::*;
421
422 #[test]
423 fn encode_nil() {
424 let v: Option<()> = None;
425 let buf = &mut [0u8; 128];
426 let len = to_slice(&v, buf).unwrap();
427 assert_eq!(buf[..len], [0xc0]);
428 }
429
430 #[test]
431 fn encode_unit() {
432 let buf = &mut [0u8; 128];
433 let len = to_slice(&(), buf).unwrap();
434 assert_eq!(buf[..len], [0xc0]);
435 }
436
437 #[test]
438 fn encode_unit_struct() {
439 #[derive(Serialize)]
440 struct Unit;
441 let buf = &mut [0u8; 128];
442 let len = to_slice(&Unit, buf).unwrap();
443 assert_eq!(buf[..len], [0xc0]);
444 }
445
446 #[test]
447 fn encode_false() {
448 let v = false;
449 let buf = &mut [0u8; 128];
450 let len = to_slice(&v, buf).unwrap();
451 assert_eq!(buf[..len], [0xc2]);
452 }
453
454 #[test]
455 fn encode_true() {
456 let v = true;
457 let buf = &mut [0u8; 128];
458 let len = to_slice(&v, buf).unwrap();
459 assert_eq!(buf[..len], [0xc3]);
460 }
461
462 #[test]
463 fn encode_bytes() {
464 let v = serde_bytes::Bytes::new(&[5, 4, 3, 2, 1, 0]);
466
467 let buf = &mut [0u8; 128];
468 let len = to_slice(&v, buf).unwrap();
469 assert_eq!(buf[..len], [0xc4, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00]);
470 }
471
472 #[test]
473 fn encode_enum() {
474 #[derive(Serialize)]
475 enum Type {
476 Bool,
477 Int,
478 Float,
479 }
480 let buf = &mut [0u8; 128];
481 {
482 let len = to_slice(&Type::Bool, buf).unwrap();
483 assert_eq!(buf[..len], [0xa4, b'B', b'o', b'o', b'l'])
484 }
485 {
486 let len = to_slice(&Type::Int, buf).unwrap();
487 assert_eq!(buf[..len], [0xa3, b'I', b'n', b't'])
488 }
489 {
490 let len = to_slice(&Type::Float, buf).unwrap();
491 assert_eq!(buf[..len], [0xa5, b'F', b'l', b'o', b'a', b't'])
492 }
493 }
494
495 #[test]
496 fn encode_newtype_struct() {
497 #[derive(Serialize)]
498 struct B(#[serde(with = "serde_bytes")] [u8; 5]);
499
500 let buf = &mut [0u8; 128];
501
502 let len = to_slice(&B([5, 4, 3, 2, 1]), buf).unwrap();
503 assert_eq!(buf[..len], [0xc4, 0x05, 0x05, 0x04, 0x03, 0x02, 0x01])
504 }
505
506 #[test]
507 fn encode_newtype_variant() {
508 #[derive(Serialize)]
509 enum Type {
510 Bool(bool),
511 Int(u8),
512 Float(f32),
513 }
514
515 let buf = &mut [0u8; 128];
516 {
517 let len = to_slice(&Type::Bool(true), buf).unwrap();
518 assert_eq!(
519 buf[..len],
520 [
521 0x81, 0xa4, b'B', b'o', b'o', b'l', 0xc3 ]
525 )
526 }
527 {
528 let len = to_slice(&Type::Int(128), buf).unwrap();
529 assert_eq!(
530 buf[..len],
531 [
532 0x81, 0xa3, b'I', b'n', b't', 0xcc, 0x80 ]
536 )
537 }
538
539 {
540 let len = to_slice(&Type::Float(12.34), buf).unwrap();
541 assert_eq!(
542 buf[..len],
543 [
544 0x81, 0xa5, b'F', b'l', b'o', b'a', b't', 0xca, 0x41, 0x45, 0x70, 0xa4 ]
548 )
549 }
550 }
551
552 #[test]
553 fn encode_struct_variant() {
554 #[derive(Serialize)]
555 enum Type {
556 Bool { flag: bool, msg: &'static str },
557 }
558
559 let buf = &mut [0u8; 128];
568 {
569 let len = to_slice(
570 &Type::Bool {
571 flag: false,
572 msg: "hi",
573 },
574 buf,
575 )
576 .unwrap();
577 assert_eq!(
578 buf[..len],
579 [
580 0x81, 0xa4, b'B', b'o', b'o', b'l', 0x82, 0xa4, b'f', b'l', b'a', b'g', 0xc2, 0xa3, b'm', b's', b'g', 0xa2, b'h', b'i',
591 ]
592 )
593 }
594 }
595
596 #[test]
597 fn encode_tuple_struct() {
598 #[derive(Serialize)]
599 struct V(i16, u32, i32);
600
601 let buf = &mut [0u8; 128];
602 let len = to_slice(&V(1, 2, 3), buf).unwrap();
603 assert_eq!(
604 buf[..len],
605 [
606 0x93, 0x01, 0x02, 0x03, ]
611 );
612 }
613
614 #[test]
615 fn encode_pos_fix_int() {
616 let v = 127_u8;
617 let buf = &mut [0u8; 128];
618 let len = to_slice(&v, buf).unwrap();
619 assert_eq!(buf[..len], [0x7f]);
620 }
621
622 #[test]
623 fn encode_neg_fix_int() {
624 let v = -32_i8;
625 let buf = &mut [0u8; 128];
626 let len = to_slice(&v, buf).unwrap();
627 assert_eq!(buf[..len], [0xe0]);
628 }
629
630 #[cfg(feature = "std")]
631 #[test]
632 fn encode_with_writer() {
633 #[derive(Serialize)]
634 struct V(i16, u32, i32);
635
636 let mut buf = vec![];
637 let len = to_writer(&V(1, 2, 3), &mut buf).unwrap();
638 assert_eq!(
639 buf[..len],
640 [
641 0x93, 0x01, 0x02, 0x03 ]
646 );
647 }
648}