1use crate::{
7 fill::Slot,
8 internal::{Internal, InternalVisitor},
9 std::{any::Any, fmt},
10 Error, ValueBag,
11};
12
13use value_bag_serde1::lib::ser::{Error as SerdeError, Impossible};
14
15impl<'v> ValueBag<'v> {
16 pub fn capture_serde1<T>(value: &'v T) -> Self
21 where
22 T: value_bag_serde1::lib::Serialize + 'static,
23 {
24 Self::try_capture(value).unwrap_or(ValueBag {
25 inner: Internal::Serde1(value),
26 })
27 }
28
29 pub const fn from_serde1<T>(value: &'v T) -> Self
31 where
32 T: value_bag_serde1::lib::Serialize,
33 {
34 ValueBag {
35 inner: Internal::SizedSerde1(value),
36 }
37 }
38
39 pub(crate) const fn from_dyn_serde1(value: &'v dyn Serialize) -> Self {
41 ValueBag {
42 inner: Internal::AnonSerde1(value),
43 }
44 }
45}
46
47pub(crate) trait DowncastSerialize {
51 fn as_any(&self) -> &dyn Any;
52 fn as_super(&self) -> &dyn Serialize;
53 #[cfg(feature = "owned")]
54 fn as_buffer(&self) -> &dyn BufferSerialize;
55}
56
57impl<T: value_bag_serde1::lib::Serialize + 'static> DowncastSerialize for T {
58 fn as_any(&self) -> &dyn Any {
59 self
60 }
61
62 fn as_super(&self) -> &dyn Serialize {
63 self
64 }
65
66 #[cfg(feature = "owned")]
67 fn as_buffer(&self) -> &dyn BufferSerialize {
68 self
69 }
70}
71
72pub(crate) trait SizedSerialize {
76 fn as_super(&self) -> &dyn Serialize;
77 #[cfg(feature = "owned")]
78 fn as_buffer(&self) -> &dyn BufferSerialize;
79}
80
81impl<T: value_bag_serde1::lib::Serialize> SizedSerialize for T {
82 fn as_super(&self) -> &dyn Serialize {
83 self
84 }
85
86 #[cfg(feature = "owned")]
87 fn as_buffer(&self) -> &dyn BufferSerialize {
88 self
89 }
90}
91
92#[cfg(feature = "owned")]
96pub(crate) trait BufferSerialize {
97 fn buffer(&self) -> Result<value_bag_serde1::buf::Owned, value_bag_serde1::buf::Error>;
98}
99
100#[cfg(feature = "owned")]
101impl<V: value_bag_serde1::lib::Serialize + ?Sized> BufferSerialize for V {
102 fn buffer(&self) -> Result<value_bag_serde1::buf::Owned, value_bag_serde1::buf::Error> {
103 value_bag_serde1::buf::Owned::buffer(self)
104 }
105}
106
107impl<'s, 'f> Slot<'s, 'f> {
108 pub fn fill_serde1<T>(self, value: T) -> Result<(), Error>
112 where
113 T: value_bag_serde1::lib::Serialize,
114 {
115 self.fill(|visitor| visitor.serde1(&value))
116 }
117}
118
119impl<'v> value_bag_serde1::lib::Serialize for ValueBag<'v> {
120 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
121 where
122 S: value_bag_serde1::lib::Serializer,
123 {
124 struct Serde1Visitor<S>
125 where
126 S: value_bag_serde1::lib::Serializer,
127 {
128 inner: Option<S>,
129 result: Option<Result<S::Ok, S::Error>>,
130 }
131
132 impl<S> Serde1Visitor<S>
133 where
134 S: value_bag_serde1::lib::Serializer,
135 {
136 fn result(&self) -> Result<(), Error> {
137 match self.result {
138 Some(Ok(_)) => Ok(()),
139 Some(Err(ref e)) => Err(Error::serde(e)),
140 None => Err(Error::msg("`serde` serialization didn't produce a result")),
141 }
142 }
143
144 fn serializer(&mut self) -> Result<S, Error> {
145 self.inner
146 .take()
147 .ok_or_else(|| Error::msg("`serde` serializer is in an invalid state"))
148 }
149
150 fn into_result(self) -> Result<S::Ok, S::Error> {
151 self.result.unwrap_or_else(|| {
152 Err(S::Error::custom(
153 "`serde` serialization didn't produce a result",
154 ))
155 })
156 }
157 }
158
159 impl<'v, S> InternalVisitor<'v> for Serde1Visitor<S>
160 where
161 S: value_bag_serde1::lib::Serializer,
162 {
163 fn fill(&mut self, v: &dyn crate::fill::Fill) -> Result<(), Error> {
164 v.fill(Slot::new(self))
165 }
166
167 fn debug(&mut self, v: &dyn fmt::Debug) -> Result<(), Error> {
168 struct DebugToDisplay<T>(T);
169
170 impl<T> fmt::Display for DebugToDisplay<T>
171 where
172 T: fmt::Debug,
173 {
174 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
175 fmt::Debug::fmt(&self.0, f)
176 }
177 }
178
179 self.result = Some(self.serializer()?.collect_str(&DebugToDisplay(v)));
180 self.result()
181 }
182
183 fn display(&mut self, v: &dyn fmt::Display) -> Result<(), Error> {
184 self.result = Some(self.serializer()?.collect_str(v));
185 self.result()
186 }
187
188 fn u64(&mut self, v: u64) -> Result<(), Error> {
189 self.result = Some(self.serializer()?.serialize_u64(v));
190 self.result()
191 }
192
193 fn i64(&mut self, v: i64) -> Result<(), Error> {
194 self.result = Some(self.serializer()?.serialize_i64(v));
195 self.result()
196 }
197
198 fn u128(&mut self, v: &u128) -> Result<(), Error> {
199 self.result = Some(self.serializer()?.serialize_u128(*v));
200 self.result()
201 }
202
203 fn i128(&mut self, v: &i128) -> Result<(), Error> {
204 self.result = Some(self.serializer()?.serialize_i128(*v));
205 self.result()
206 }
207
208 fn f64(&mut self, v: f64) -> Result<(), Error> {
209 self.result = Some(self.serializer()?.serialize_f64(v));
210 self.result()
211 }
212
213 fn bool(&mut self, v: bool) -> Result<(), Error> {
214 self.result = Some(self.serializer()?.serialize_bool(v));
215 self.result()
216 }
217
218 fn char(&mut self, v: char) -> Result<(), Error> {
219 self.result = Some(self.serializer()?.serialize_char(v));
220 self.result()
221 }
222
223 fn str(&mut self, v: &str) -> Result<(), Error> {
224 self.result = Some(self.serializer()?.serialize_str(v));
225 self.result()
226 }
227
228 fn none(&mut self) -> Result<(), Error> {
229 self.result = Some(self.serializer()?.serialize_none());
230 self.result()
231 }
232
233 #[cfg(feature = "error")]
234 fn error(
235 &mut self,
236 v: &(dyn crate::internal::error::Error + 'static),
237 ) -> Result<(), Error> {
238 self.result = Some(self.serializer()?.collect_str(v));
239 self.result()
240 }
241
242 #[cfg(feature = "sval2")]
243 fn sval2(&mut self, v: &dyn crate::internal::sval::v2::Value) -> Result<(), Error> {
244 self.result = Some(crate::internal::sval::v2::serde1(self.serializer()?, v));
245 self.result()
246 }
247
248 fn serde1(&mut self, v: &dyn Serialize) -> Result<(), Error> {
249 self.result = Some(value_bag_serde1::erased::serialize(v, self.serializer()?));
250 self.result()
251 }
252
253 #[cfg(feature = "seq")]
254 fn seq(&mut self, v: &dyn crate::internal::seq::Seq) -> Result<(), Error> {
255 self.result = Some(serialize_seq(self.serializer()?, v));
256 self.result()
257 }
258
259 fn poisoned(&mut self, msg: &'static str) -> Result<(), Error> {
260 self.result = Some(Err(S::Error::custom(msg)));
261 self.result()
262 }
263 }
264
265 let mut visitor = Serde1Visitor {
266 inner: Some(s),
267 result: None,
268 };
269
270 self.internal_visit(&mut visitor)
271 .map_err(S::Error::custom)?;
272
273 visitor.into_result()
274 }
275}
276
277pub use value_bag_serde1::erased::Serialize;
278
279pub(in crate::internal) fn fmt(f: &mut fmt::Formatter, v: &dyn Serialize) -> Result<(), Error> {
280 fmt::Debug::fmt(&value_bag_serde1::fmt::to_debug(v), f)?;
281 Ok(())
282}
283
284#[cfg(feature = "sval2")]
285pub(in crate::internal) fn sval2<'sval, S: value_bag_sval2::lib::Stream<'sval> + ?Sized>(
286 s: &mut S,
287 v: &dyn Serialize,
288) -> Result<(), Error> {
289 value_bag_sval2::serde1::stream(s, v).map_err(Error::from_sval2)
290}
291
292#[cfg(feature = "seq")]
293fn serialize_seq<S: value_bag_serde1::lib::Serializer>(
294 s: S,
295 seq: &dyn crate::internal::seq::Seq,
296) -> Result<S::Ok, S::Error> {
297 use crate::std::ops::ControlFlow;
298
299 use value_bag_serde1::lib::ser::SerializeSeq;
300
301 struct SerializeVisitor<S: SerializeSeq> {
302 serializer: S,
303 err: Option<S::Error>,
304 }
305
306 impl<'v, S: SerializeSeq> crate::internal::seq::Visitor<'v> for SerializeVisitor<S> {
307 fn element(&mut self, v: ValueBag) -> ControlFlow<()> {
308 match self.serializer.serialize_element(&v) {
309 Ok(()) => ControlFlow::Continue(()),
310 Err(e) => {
311 self.err = Some(e);
312 ControlFlow::Break(())
313 }
314 }
315 }
316 }
317
318 let mut s = SerializeVisitor {
319 serializer: s.serialize_seq(None)?,
320 err: None,
321 };
322 seq.visit(&mut s);
323 if let Some(e) = s.err {
324 return Err(e);
325 }
326
327 s.serializer.end()
328}
329
330pub(crate) fn internal_visit(v: &dyn Serialize, visitor: &mut dyn InternalVisitor<'_>) -> bool {
331 struct VisitorSerializer<'a, 'v>(&'a mut dyn InternalVisitor<'v>);
332
333 impl<'a, 'v> value_bag_serde1::lib::Serializer for VisitorSerializer<'a, 'v> {
334 type Ok = ();
335 type Error = Unsupported;
336
337 type SerializeSeq = Impossible<Self::Ok, Self::Error>;
338 type SerializeTuple = Impossible<Self::Ok, Self::Error>;
339 type SerializeTupleStruct = Impossible<Self::Ok, Self::Error>;
340 type SerializeTupleVariant = Impossible<Self::Ok, Self::Error>;
341 type SerializeMap = Impossible<Self::Ok, Self::Error>;
342 type SerializeStruct = Impossible<Self::Ok, Self::Error>;
343 type SerializeStructVariant = Impossible<Self::Ok, Self::Error>;
344
345 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> {
346 self.0.u64(v as u64).map_err(|_| Unsupported)
347 }
348
349 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> {
350 self.0.u64(v as u64).map_err(|_| Unsupported)
351 }
352
353 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> {
354 self.0.u64(v as u64).map_err(|_| Unsupported)
355 }
356
357 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> {
358 self.0.u64(v).map_err(|_| Unsupported)
359 }
360
361 fn serialize_u128(self, v: u128) -> Result<Self::Ok, Self::Error> {
362 self.0.u128(&v).map_err(|_| Unsupported)
363 }
364
365 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> {
366 self.0.i64(v as i64).map_err(|_| Unsupported)
367 }
368
369 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> {
370 self.0.i64(v as i64).map_err(|_| Unsupported)
371 }
372
373 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> {
374 self.0.i64(v as i64).map_err(|_| Unsupported)
375 }
376
377 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> {
378 self.0.i64(v).map_err(|_| Unsupported)
379 }
380
381 fn serialize_i128(self, v: i128) -> Result<Self::Ok, Self::Error> {
382 self.0.i128(&v).map_err(|_| Unsupported)
383 }
384
385 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> {
386 self.0.f64(v as f64).map_err(|_| Unsupported)
387 }
388
389 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> {
390 self.0.f64(v).map_err(|_| Unsupported)
391 }
392
393 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> {
394 self.0.char(v).map_err(|_| Unsupported)
395 }
396
397 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> {
398 self.0.bool(v).map_err(|_| Unsupported)
399 }
400
401 fn serialize_some<T>(self, v: &T) -> Result<Self::Ok, Self::Error>
402 where
403 T: value_bag_serde1::lib::Serialize + ?Sized,
404 {
405 v.serialize(self)
406 }
407
408 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
409 self.0.none().map_err(|_| Unsupported)
410 }
411
412 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
413 self.0.none().map_err(|_| Unsupported)
414 }
415
416 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
417 Err(Unsupported)
418 }
419
420 fn serialize_str(self, s: &str) -> Result<Self::Ok, Self::Error> {
421 self.0.str(s).map_err(|_| Unsupported)
422 }
423
424 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
425 Err(Unsupported)
426 }
427
428 fn serialize_unit_variant(
429 self,
430 _: &'static str,
431 _: u32,
432 _: &'static str,
433 ) -> Result<Self::Ok, Self::Error> {
434 Err(Unsupported)
435 }
436
437 fn serialize_newtype_struct<T>(
438 self,
439 _: &'static str,
440 _: &T,
441 ) -> Result<Self::Ok, Self::Error>
442 where
443 T: value_bag_serde1::lib::Serialize + ?Sized,
444 {
445 Err(Unsupported)
446 }
447
448 fn serialize_newtype_variant<T>(
449 self,
450 _: &'static str,
451 _: u32,
452 _: &'static str,
453 _: &T,
454 ) -> Result<Self::Ok, Self::Error>
455 where
456 T: value_bag_serde1::lib::Serialize + ?Sized,
457 {
458 Err(Unsupported)
459 }
460
461 fn serialize_seq(
462 self,
463 _: core::option::Option<usize>,
464 ) -> Result<Self::SerializeSeq, Self::Error> {
465 Err(Unsupported)
466 }
467
468 fn serialize_tuple(self, _: usize) -> Result<Self::SerializeTuple, Self::Error> {
469 Err(Unsupported)
470 }
471
472 fn serialize_tuple_struct(
473 self,
474 _: &'static str,
475 _: usize,
476 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
477 Err(Unsupported)
478 }
479
480 fn serialize_tuple_variant(
481 self,
482 _: &'static str,
483 _: u32,
484 _: &'static str,
485 _: usize,
486 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
487 Err(Unsupported)
488 }
489
490 fn serialize_map(
491 self,
492 _: core::option::Option<usize>,
493 ) -> Result<Self::SerializeMap, Self::Error> {
494 Err(Unsupported)
495 }
496
497 fn serialize_struct(
498 self,
499 _: &'static str,
500 _: usize,
501 ) -> Result<Self::SerializeStruct, Self::Error> {
502 Err(Unsupported)
503 }
504
505 fn serialize_struct_variant(
506 self,
507 _: &'static str,
508 _: u32,
509 _: &'static str,
510 _: usize,
511 ) -> Result<Self::SerializeStructVariant, Self::Error> {
512 Err(Unsupported)
513 }
514 }
515
516 value_bag_serde1::erased::serialize(v, VisitorSerializer(visitor)).is_ok()
517}
518
519impl Error {
520 fn serde(e: impl fmt::Display) -> Self {
521 Error::try_boxed("`serde` serialization failed", e)
522 }
523}
524
525#[derive(Debug)]
526struct Unsupported;
527
528impl fmt::Display for Unsupported {
529 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
530 write!(f, "invalid cast")
531 }
532}
533
534impl value_bag_serde1::lib::ser::Error for Unsupported {
535 fn custom<T>(_: T) -> Self
536 where
537 T: fmt::Display,
538 {
539 Unsupported
540 }
541}
542
543impl value_bag_serde1::lib::ser::StdError for Unsupported {}
544
545#[cfg(feature = "seq")]
546pub(crate) mod seq {
547 use super::*;
548
549 use crate::internal::seq::ExtendValue;
550
551 #[inline]
552 pub(crate) fn extend<'a, S: Default + ExtendValue<'a>>(v: &dyn Serialize) -> Option<S> {
553 use crate::std::marker::PhantomData;
554
555 struct Root<S>(PhantomData<S>);
556
557 struct Seq<S>(S);
558
559 impl<'a, S: Default + ExtendValue<'a>> value_bag_serde1::lib::Serializer for Root<S> {
560 type Ok = S;
561
562 type Error = Unsupported;
563
564 type SerializeSeq = Seq<S>;
565
566 type SerializeTuple = Seq<S>;
567
568 type SerializeTupleStruct = value_bag_serde1::lib::ser::Impossible<S, Unsupported>;
569
570 type SerializeTupleVariant = value_bag_serde1::lib::ser::Impossible<S, Unsupported>;
571
572 type SerializeMap = value_bag_serde1::lib::ser::Impossible<S, Unsupported>;
573
574 type SerializeStruct = value_bag_serde1::lib::ser::Impossible<S, Unsupported>;
575
576 type SerializeStructVariant = value_bag_serde1::lib::ser::Impossible<S, Unsupported>;
577
578 fn serialize_bool(self, _: bool) -> Result<Self::Ok, Self::Error> {
579 Err(Unsupported)
580 }
581
582 fn serialize_i8(self, _: i8) -> Result<Self::Ok, Self::Error> {
583 Err(Unsupported)
584 }
585
586 fn serialize_i16(self, _: i16) -> Result<Self::Ok, Self::Error> {
587 Err(Unsupported)
588 }
589
590 fn serialize_i32(self, _: i32) -> Result<Self::Ok, Self::Error> {
591 Err(Unsupported)
592 }
593
594 fn serialize_i64(self, _: i64) -> Result<Self::Ok, Self::Error> {
595 Err(Unsupported)
596 }
597
598 fn serialize_u8(self, _: u8) -> Result<Self::Ok, Self::Error> {
599 Err(Unsupported)
600 }
601
602 fn serialize_u16(self, _: u16) -> Result<Self::Ok, Self::Error> {
603 Err(Unsupported)
604 }
605
606 fn serialize_u32(self, _: u32) -> Result<Self::Ok, Self::Error> {
607 Err(Unsupported)
608 }
609
610 fn serialize_u64(self, _: u64) -> Result<Self::Ok, Self::Error> {
611 Err(Unsupported)
612 }
613
614 fn serialize_f32(self, _: f32) -> Result<Self::Ok, Self::Error> {
615 Err(Unsupported)
616 }
617
618 fn serialize_f64(self, _: f64) -> Result<Self::Ok, Self::Error> {
619 Err(Unsupported)
620 }
621
622 fn serialize_char(self, _: char) -> Result<Self::Ok, Self::Error> {
623 Err(Unsupported)
624 }
625
626 fn serialize_str(self, _: &str) -> Result<Self::Ok, Self::Error> {
627 Err(Unsupported)
628 }
629
630 fn serialize_bytes(self, _: &[u8]) -> Result<Self::Ok, Self::Error> {
631 Err(Unsupported)
632 }
633
634 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
635 Err(Unsupported)
636 }
637
638 fn serialize_some<T: value_bag_serde1::lib::Serialize + ?Sized>(
639 self,
640 value: &T,
641 ) -> Result<Self::Ok, Self::Error> {
642 value.serialize(self)
643 }
644
645 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
646 Err(Unsupported)
647 }
648
649 fn serialize_unit_struct(self, _: &'static str) -> Result<Self::Ok, Self::Error> {
650 Err(Unsupported)
651 }
652
653 fn serialize_unit_variant(
654 self,
655 _: &'static str,
656 _: u32,
657 _: &'static str,
658 ) -> Result<Self::Ok, Self::Error> {
659 Err(Unsupported)
660 }
661
662 fn serialize_newtype_struct<T: value_bag_serde1::lib::Serialize + ?Sized>(
663 self,
664 _: &'static str,
665 _: &T,
666 ) -> Result<Self::Ok, Self::Error> {
667 Err(Unsupported)
668 }
669
670 fn serialize_newtype_variant<T: value_bag_serde1::lib::Serialize + ?Sized>(
671 self,
672 _: &'static str,
673 _: u32,
674 _: &'static str,
675 _: &T,
676 ) -> Result<Self::Ok, Self::Error> {
677 Err(Unsupported)
678 }
679
680 fn serialize_seq(self, _: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
681 Ok(Seq(S::default()))
682 }
683
684 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
685 self.serialize_seq(Some(len))
686 }
687
688 fn serialize_tuple_struct(
689 self,
690 _: &'static str,
691 _: usize,
692 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
693 Err(Unsupported)
694 }
695
696 fn serialize_tuple_variant(
697 self,
698 _: &'static str,
699 _: u32,
700 _: &'static str,
701 _: usize,
702 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
703 Err(Unsupported)
704 }
705
706 fn serialize_map(self, _: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
707 Err(Unsupported)
708 }
709
710 fn serialize_struct(
711 self,
712 _: &'static str,
713 _: usize,
714 ) -> Result<Self::SerializeStruct, Self::Error> {
715 Err(Unsupported)
716 }
717
718 fn serialize_struct_variant(
719 self,
720 _: &'static str,
721 _: u32,
722 _: &'static str,
723 _: usize,
724 ) -> Result<Self::SerializeStructVariant, Self::Error> {
725 Err(Unsupported)
726 }
727 }
728
729 impl<'a, S: ExtendValue<'a>> value_bag_serde1::lib::ser::SerializeSeq for Seq<S> {
730 type Ok = S;
731
732 type Error = Unsupported;
733
734 fn serialize_element<T: value_bag_serde1::lib::Serialize + ?Sized>(
735 &mut self,
736 value: &T,
737 ) -> Result<(), Self::Error> {
738 self.0.extend(Internal::AnonSerde1(&value));
739 Ok(())
740 }
741
742 fn end(self) -> Result<Self::Ok, Self::Error> {
743 Ok(self.0)
744 }
745 }
746
747 impl<'a, S: ExtendValue<'a>> value_bag_serde1::lib::ser::SerializeTuple for Seq<S> {
748 type Ok = S;
749
750 type Error = Unsupported;
751
752 fn serialize_element<T: value_bag_serde1::lib::Serialize + ?Sized>(
753 &mut self,
754 value: &T,
755 ) -> Result<(), Self::Error> {
756 value_bag_serde1::lib::ser::SerializeSeq::serialize_element(self, value)
757 }
758
759 fn end(self) -> Result<Self::Ok, Self::Error> {
760 value_bag_serde1::lib::ser::SerializeSeq::end(self)
761 }
762 }
763
764 value_bag_serde1::lib::Serialize::serialize(v, Root::<S>(Default::default())).ok()
765 }
766}
767
768#[cfg(feature = "owned")]
769pub(crate) mod owned {
770 impl value_bag_serde1::lib::Serialize for crate::OwnedValueBag {
771 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
772 where
773 S: value_bag_serde1::lib::Serializer,
774 {
775 value_bag_serde1::lib::Serialize::serialize(&self.by_ref(), s)
776 }
777 }
778
779 pub(crate) type OwnedSerialize = value_bag_serde1::buf::Owned;
780
781 pub(crate) fn buffer(
782 v: impl value_bag_serde1::lib::Serialize,
783 ) -> Result<OwnedSerialize, value_bag_serde1::buf::Error> {
784 value_bag_serde1::buf::Owned::buffer(v)
785 }
786}
787
788#[cfg(test)]
789mod tests {
790 #[cfg(target_arch = "wasm32")]
791 use wasm_bindgen_test::*;
792
793 use super::*;
794 use crate::test::*;
795
796 #[test]
797 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
798 fn serde1_capture() {
799 assert_eq!(
800 ValueBag::capture_serde1(&42u64).to_test_token(),
801 TestToken::U64(42)
802 );
803 }
804
805 #[test]
806 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
807 fn serde1_fill() {
808 assert_eq!(
809 ValueBag::from_fill(&|slot: Slot| slot.fill_serde1(42u64)).to_test_token(),
810 TestToken::Serde { version: 1 },
811 );
812 }
813
814 #[test]
815 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
816 fn serde1_capture_cast() {
817 assert_eq!(
818 42u64,
819 ValueBag::capture_serde1(&42u64)
820 .to_u64()
821 .expect("invalid value")
822 );
823
824 assert_eq!(
825 "a string",
826 ValueBag::capture_serde1(&"a string")
827 .to_borrowed_str()
828 .expect("invalid value")
829 );
830
831 #[cfg(feature = "std")]
832 assert_eq!(
833 "a string",
834 ValueBag::capture_serde1(&"a string")
835 .to_str()
836 .expect("invalid value")
837 );
838 }
839
840 #[test]
841 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
842 fn serde1_from_cast() {
843 assert_eq!(
844 42u64,
845 ValueBag::from_serde1(&42u64)
846 .to_u64()
847 .expect("invalid value")
848 );
849
850 #[cfg(feature = "std")]
851 assert_eq!(
852 "a string",
853 ValueBag::from_serde1(&"a string")
854 .to_str()
855 .expect("invalid value")
856 );
857 }
858
859 #[test]
860 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
861 fn serde1_downcast() {
862 #[derive(Debug, PartialEq, Eq)]
863 struct Timestamp(usize);
864
865 impl value_bag_serde1::lib::Serialize for Timestamp {
866 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
867 where
868 S: value_bag_serde1::lib::Serializer,
869 {
870 s.serialize_u64(self.0 as u64)
871 }
872 }
873
874 let ts = Timestamp(42);
875
876 assert_eq!(
877 &ts,
878 ValueBag::capture_serde1(&ts)
879 .downcast_ref::<Timestamp>()
880 .expect("invalid value")
881 );
882 }
883
884 #[test]
885 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
886 fn serde1_structured() {
887 use value_bag_serde1::test::{assert_ser_tokens, Token};
888
889 assert_ser_tokens(&ValueBag::from(42u64), &[Token::U64(42)]);
890 }
891
892 #[test]
893 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
894 fn serde1_debug() {
895 struct TestSerde;
896
897 impl value_bag_serde1::lib::Serialize for TestSerde {
898 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
899 where
900 S: value_bag_serde1::lib::Serializer,
901 {
902 s.serialize_u64(42)
903 }
904 }
905
906 assert_eq!(
907 format!("{:04?}", 42u64),
908 format!("{:04?}", ValueBag::capture_serde1(&TestSerde)),
909 );
910 }
911
912 #[test]
913 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
914 fn serde1_visit() {
915 ValueBag::from_serde1(&42u64)
916 .visit(TestVisit::default())
917 .expect("failed to visit value");
918 ValueBag::from_serde1(&-42i64)
919 .visit(TestVisit::default())
920 .expect("failed to visit value");
921 ValueBag::from_serde1(&11f64)
922 .visit(TestVisit::default())
923 .expect("failed to visit value");
924 ValueBag::from_serde1(&true)
925 .visit(TestVisit::default())
926 .expect("failed to visit value");
927 ValueBag::from_serde1(&"some string")
928 .visit(TestVisit::default())
929 .expect("failed to visit value");
930 ValueBag::from_serde1(&'n')
931 .visit(TestVisit::default())
932 .expect("failed to visit value");
933 }
934
935 #[test]
936 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
937 #[cfg(feature = "sval2")]
938 fn serde1_sval2() {
939 use value_bag_sval2::test::Token;
940
941 struct TestSerde;
942
943 impl value_bag_serde1::lib::Serialize for TestSerde {
944 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
945 where
946 S: value_bag_serde1::lib::Serializer,
947 {
948 s.serialize_u64(42)
949 }
950 }
951
952 let value = ValueBag::from_serde1(&TestSerde);
953
954 value_bag_sval2::test::assert_tokens(&value, &[Token::U64(42)]);
955 }
956
957 #[cfg(feature = "seq")]
958 mod seq_support {
959 use super::*;
960
961 use crate::std::vec::Vec;
962
963 #[test]
964 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
965 fn serde1_stream_str_seq() {
966 use value_bag_serde1::test::{assert_ser_tokens, Token};
967
968 assert_ser_tokens(
969 &ValueBag::from_seq_slice(&["a", "b", "c"]),
970 &[
971 Token::Seq { len: None },
972 Token::Str("a"),
973 Token::Str("b"),
974 Token::Str("c"),
975 Token::SeqEnd,
976 ],
977 );
978 }
979
980 #[test]
981 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
982 fn serde1_to_seq() {
983 assert_eq!(
984 vec![Some(1.0), None, Some(2.0), Some(3.0), None],
985 ValueBag::capture_serde1(&[
986 &1.0 as &dyn Serialize,
987 &true as &dyn Serialize,
988 &2.0 as &dyn Serialize,
989 &3.0 as &dyn Serialize,
990 &"a string" as &dyn Serialize,
991 ])
992 .to_f64_seq::<Vec<Option<f64>>>()
993 .expect("invalid value")
994 );
995 }
996
997 #[test]
998 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
999 fn serde1_as_seq() {
1000 assert_eq!(
1001 vec![1.0, 2.0, 3.0],
1002 ValueBag::capture_serde1(&[1.0, 2.0, 3.0,]).as_f64_seq::<Vec<f64>>()
1003 );
1004 }
1005 }
1006
1007 #[cfg(feature = "std")]
1008 mod std_support {
1009 use super::*;
1010
1011 use crate::std::borrow::ToOwned;
1012
1013 #[test]
1014 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
1015 fn serde1_cast() {
1016 assert_eq!(
1017 "a string",
1018 ValueBag::capture_serde1(&"a string".to_owned())
1019 .by_ref()
1020 .to_str()
1021 .expect("invalid value")
1022 );
1023 }
1024 }
1025
1026 #[cfg(feature = "owned")]
1027 mod owned_support {
1028 use super::*;
1029
1030 #[test]
1031 #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)]
1032 fn serde1_to_owned_poison() {
1033 struct Kaboom;
1034
1035 impl value_bag_serde1::lib::Serialize for Kaboom {
1036 fn serialize<S>(&self, _: S) -> Result<S::Ok, S::Error>
1037 where
1038 S: value_bag_serde1::lib::Serializer,
1039 {
1040 Err(S::Error::custom("kaboom"))
1041 }
1042 }
1043
1044 let value = ValueBag::capture_serde1(&Kaboom)
1045 .to_owned()
1046 .by_ref()
1047 .to_test_token();
1048
1049 assert_eq!(
1050 TestToken::Poisoned("failed to buffer the value".into()),
1051 value
1052 );
1053 }
1054 }
1055}