1use core::any::Any;
2use core::cell::{Cell, RefCell};
3use core::ops::{Bound, Range, RangeFrom, RangeInclusive, RangeTo};
4
5use serde::{Deserializer, Serializer};
6
7use crate::{
8 Homogeneous, Keys, Named, Numbered, Schema, SerdeError, TreeAny, TreeDeserialize, TreeSchema,
9 TreeSerialize, ValueError,
10};
11
12macro_rules! impl_tuple {
15 ($($i:tt $t:ident)+) => {
16 impl<$($t: TreeSchema),+> TreeSchema for ($($t,)+) {
17 const SCHEMA: &'static Schema = &Schema::numbered(&[$(
18 Numbered::new($t::SCHEMA),
19 )+]);
20 }
21
22 impl<$($t: TreeSerialize),+> TreeSerialize for ($($t,)+) {
23 #[inline]
24 fn serialize_by_key<S: Serializer>(
25 &self,
26 mut keys: impl Keys,
27 ser: S
28 ) -> Result<S::Ok, SerdeError<S::Error>>
29 {
30 match Self::SCHEMA.next(&mut keys)? {
31 $($i => self.$i.serialize_by_key(keys, ser),)+
32 _ => unreachable!()
33 }
34 }
35 }
36
37 impl<'de, $($t: TreeDeserialize<'de>),+> TreeDeserialize<'de> for ($($t,)+) {
38 #[inline]
39 fn deserialize_by_key<D: Deserializer<'de>>(
40 &mut self,
41 mut keys: impl Keys,
42 de: D
43 ) -> Result<(), SerdeError<D::Error>>
44 {
45 match Self::SCHEMA.next(&mut keys)? {
46 $($i => self.$i.deserialize_by_key(keys, de),)+
47 _ => unreachable!()
48 }
49 }
50
51 #[inline]
52 fn probe_by_key<D: Deserializer<'de>>(
53 mut keys: impl Keys,
54 de: D
55 ) -> Result<(), SerdeError<D::Error>>
56 {
57 match Self::SCHEMA.next(&mut keys)? {
58 $($i => $t::probe_by_key(keys, de),)+
59 _ => unreachable!()
60 }
61 }
62 }
63
64 impl<$($t: TreeAny),+> TreeAny for ($($t,)+) {
65 #[inline]
66 fn ref_any_by_key(
67 &self,
68 mut keys: impl Keys
69 ) -> Result<&dyn Any, ValueError>
70 {
71 match Self::SCHEMA.next(&mut keys)? {
72 $($i => self.$i.ref_any_by_key(keys),)+
73 _ => unreachable!()
74 }
75 }
76
77 #[inline]
78 fn mut_any_by_key(
79 &mut self,
80 mut keys: impl Keys
81 ) -> Result<&mut dyn Any, ValueError>
82 {
83 match Self::SCHEMA.next(&mut keys)? {
84 $($i => self.$i.mut_any_by_key(keys),)+
85 _ => unreachable!()
86 }
87 }
88 }
89 }
90}
91impl_tuple!(0 T0);
92impl_tuple!(0 T0 1 T1);
93impl_tuple!(0 T0 1 T1 2 T2);
94impl_tuple!(0 T0 1 T1 2 T2 3 T3);
95impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4);
96impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5);
97impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6);
98impl_tuple!(0 T0 1 T1 2 T2 3 T3 4 T4 5 T5 6 T6 7 T7);
99
100impl<T: TreeSchema, const N: usize> TreeSchema for [T; N] {
103 const SCHEMA: &'static Schema = &Schema::homogeneous(Homogeneous::new(N, T::SCHEMA));
104}
105
106impl<T: TreeSerialize, const N: usize> TreeSerialize for [T; N]
107where
108 Self: TreeSchema,
109{
110 #[inline]
111 fn serialize_by_key<S: Serializer>(
112 &self,
113 mut keys: impl Keys,
114 ser: S,
115 ) -> Result<S::Ok, SerdeError<S::Error>> {
116 self[Self::SCHEMA.next(&mut keys)?].serialize_by_key(keys, ser)
117 }
118}
119
120impl<'de, T: TreeDeserialize<'de>, const N: usize> TreeDeserialize<'de> for [T; N] {
121 #[inline]
122 fn deserialize_by_key<D: Deserializer<'de>>(
123 &mut self,
124 mut keys: impl Keys,
125 de: D,
126 ) -> Result<(), SerdeError<D::Error>> {
127 self[Self::SCHEMA.next(&mut keys)?].deserialize_by_key(keys, de)
128 }
129
130 #[inline]
131 fn probe_by_key<D: Deserializer<'de>>(
132 mut keys: impl Keys,
133 de: D,
134 ) -> Result<(), SerdeError<D::Error>> {
135 Self::SCHEMA.next(&mut keys)?;
136 T::probe_by_key(keys, de)
137 }
138}
139
140impl<T: TreeAny, const N: usize> TreeAny for [T; N] {
141 #[inline]
142 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
143 self[Self::SCHEMA.next(&mut keys)?].ref_any_by_key(keys)
144 }
145
146 #[inline]
147 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
148 self[Self::SCHEMA.next(&mut keys)?].mut_any_by_key(keys)
149 }
150}
151
152impl<T: TreeSchema> TreeSchema for Option<T> {
155 const SCHEMA: &'static Schema = T::SCHEMA;
156}
157
158impl<T: TreeSerialize> TreeSerialize for Option<T> {
159 #[inline]
160 fn serialize_by_key<S: Serializer>(
161 &self,
162 keys: impl Keys,
163 ser: S,
164 ) -> Result<S::Ok, SerdeError<S::Error>> {
165 self.as_ref()
166 .ok_or(ValueError::Absent)?
167 .serialize_by_key(keys, ser)
168 }
169}
170
171impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Option<T> {
172 #[inline]
173 fn deserialize_by_key<D: Deserializer<'de>>(
174 &mut self,
175 keys: impl Keys,
176 de: D,
177 ) -> Result<(), SerdeError<D::Error>> {
178 self.as_mut()
179 .ok_or(ValueError::Absent)?
180 .deserialize_by_key(keys, de)
181 }
182
183 #[inline]
184 fn probe_by_key<D: Deserializer<'de>>(
185 keys: impl Keys,
186 de: D,
187 ) -> Result<(), SerdeError<D::Error>> {
188 T::probe_by_key(keys, de)
189 }
190}
191
192impl<T: TreeAny> TreeAny for Option<T> {
193 #[inline]
194 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
195 self.as_ref()
196 .ok_or(ValueError::Absent)?
197 .ref_any_by_key(keys)
198 }
199
200 #[inline]
201 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
202 self.as_mut()
203 .ok_or(ValueError::Absent)?
204 .mut_any_by_key(keys)
205 }
206}
207
208impl<T: TreeSchema, E: TreeSchema> TreeSchema for Result<T, E> {
211 const SCHEMA: &'static Schema =
212 &Schema::named(&[Named::new("Ok", T::SCHEMA), Named::new("Err", E::SCHEMA)]);
213}
214
215impl<T: TreeSerialize, E: TreeSerialize> TreeSerialize for Result<T, E> {
216 #[inline]
217 fn serialize_by_key<S: Serializer>(
218 &self,
219 mut keys: impl Keys,
220 ser: S,
221 ) -> Result<S::Ok, SerdeError<S::Error>> {
222 match (self, Self::SCHEMA.next(&mut keys)?) {
223 (Ok(value), 0) => value.serialize_by_key(keys, ser),
224 (Err(value), 1) => value.serialize_by_key(keys, ser),
225 _ => Err(ValueError::Absent.into()),
226 }
227 }
228}
229
230impl<'de, T: TreeDeserialize<'de>, E: TreeDeserialize<'de>> TreeDeserialize<'de> for Result<T, E> {
231 #[inline]
232 fn deserialize_by_key<D: Deserializer<'de>>(
233 &mut self,
234 mut keys: impl Keys,
235 de: D,
236 ) -> Result<(), SerdeError<D::Error>> {
237 match (self, Self::SCHEMA.next(&mut keys)?) {
238 (Ok(value), 0) => value.deserialize_by_key(keys, de),
239 (Err(value), 1) => value.deserialize_by_key(keys, de),
240 _ => Err(ValueError::Absent.into()),
241 }
242 }
243
244 #[inline]
245 fn probe_by_key<D: Deserializer<'de>>(
246 mut keys: impl Keys,
247 de: D,
248 ) -> Result<(), SerdeError<D::Error>> {
249 match Self::SCHEMA.next(&mut keys)? {
250 0 => T::probe_by_key(keys, de),
251 1 => E::probe_by_key(keys, de),
252 _ => unreachable!(),
253 }
254 }
255}
256
257impl<T: TreeAny, E: TreeAny> TreeAny for Result<T, E> {
258 #[inline]
259 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
260 match (self, Self::SCHEMA.next(&mut keys)?) {
261 (Ok(value), 0) => value.ref_any_by_key(keys),
262 (Err(value), 1) => value.ref_any_by_key(keys),
263 _ => Err(ValueError::Absent),
264 }
265 }
266
267 #[inline]
268 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
269 match (self, Self::SCHEMA.next(&mut keys)?) {
270 (Ok(value), 0) => value.mut_any_by_key(keys),
271 (Err(value), 1) => value.mut_any_by_key(keys),
272 _ => Err(ValueError::Absent),
273 }
274 }
275}
276
277impl<T: TreeSchema> TreeSchema for Bound<T> {
280 const SCHEMA: &'static Schema = &Schema::named(&[
281 Named::new("Included", T::SCHEMA),
282 Named::new("Excluded", T::SCHEMA),
283 ]);
284}
285
286impl<T: TreeSerialize> TreeSerialize for Bound<T> {
287 #[inline]
288 fn serialize_by_key<S: Serializer>(
289 &self,
290 mut keys: impl Keys,
291 ser: S,
292 ) -> Result<S::Ok, SerdeError<S::Error>> {
293 match (self, Self::SCHEMA.next(&mut keys)?) {
294 (Self::Included(value), 0) | (Self::Excluded(value), 1) => {
295 value.serialize_by_key(keys, ser)
296 }
297 _ => Err(ValueError::Absent.into()),
298 }
299 }
300}
301
302impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Bound<T> {
303 #[inline]
304 fn deserialize_by_key<D: Deserializer<'de>>(
305 &mut self,
306 mut keys: impl Keys,
307 de: D,
308 ) -> Result<(), SerdeError<D::Error>> {
309 match (self, Self::SCHEMA.next(&mut keys)?) {
310 (Self::Included(value), 0) | (Self::Excluded(value), 1) => {
311 value.deserialize_by_key(keys, de)
312 }
313 _ => Err(ValueError::Absent.into()),
314 }
315 }
316
317 #[inline]
318 fn probe_by_key<D: Deserializer<'de>>(
319 mut keys: impl Keys,
320 de: D,
321 ) -> Result<(), SerdeError<D::Error>> {
322 match Self::SCHEMA.next(&mut keys)? {
323 0..=1 => T::probe_by_key(keys, de),
324 _ => unreachable!(),
325 }
326 }
327}
328
329impl<T: TreeAny> TreeAny for Bound<T> {
330 #[inline]
331 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
332 match (self, Self::SCHEMA.next(&mut keys)?) {
333 (Self::Included(value), 0) | (Self::Excluded(value), 1) => value.ref_any_by_key(keys),
334 _ => Err(ValueError::Absent),
335 }
336 }
337
338 #[inline]
339 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
340 match (self, Self::SCHEMA.next(&mut keys)?) {
341 (Self::Included(value), 0) | (Self::Excluded(value), 1) => value.mut_any_by_key(keys),
342 _ => Err(ValueError::Absent),
343 }
344 }
345}
346
347impl<T: TreeSchema> TreeSchema for Range<T> {
350 const SCHEMA: &'static Schema =
351 &Schema::named(&[Named::new("start", T::SCHEMA), Named::new("end", T::SCHEMA)]);
352}
353
354impl<T: TreeSerialize> TreeSerialize for Range<T> {
355 #[inline]
356 fn serialize_by_key<S: Serializer>(
357 &self,
358 mut keys: impl Keys,
359 ser: S,
360 ) -> Result<S::Ok, SerdeError<S::Error>> {
361 match Self::SCHEMA.next(&mut keys)? {
362 0 => &self.start,
363 1 => &self.end,
364 _ => unreachable!(),
365 }
366 .serialize_by_key(keys, ser)
367 }
368}
369
370impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Range<T> {
371 #[inline]
372 fn deserialize_by_key<D: Deserializer<'de>>(
373 &mut self,
374 mut keys: impl Keys,
375 de: D,
376 ) -> Result<(), SerdeError<D::Error>> {
377 match Self::SCHEMA.next(&mut keys)? {
378 0 => &mut self.start,
379 1 => &mut self.end,
380 _ => unreachable!(),
381 }
382 .deserialize_by_key(keys, de)
383 }
384
385 #[inline]
386 fn probe_by_key<D: Deserializer<'de>>(
387 mut keys: impl Keys,
388 de: D,
389 ) -> Result<(), SerdeError<D::Error>> {
390 match Self::SCHEMA.next(&mut keys)? {
391 0..=1 => T::probe_by_key(keys, de),
392 _ => unreachable!(),
393 }
394 }
395}
396
397impl<T: TreeAny> TreeAny for Range<T> {
398 #[inline]
399 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
400 match Self::SCHEMA.next(&mut keys)? {
401 0 => &self.start,
402 1 => &self.end,
403 _ => unreachable!(),
404 }
405 .ref_any_by_key(keys)
406 }
407
408 #[inline]
409 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
410 match Self::SCHEMA.next(&mut keys)? {
411 0 => &mut self.start,
412 1 => &mut self.end,
413 _ => unreachable!(),
414 }
415 .mut_any_by_key(keys)
416 }
417}
418
419impl<T: TreeSchema> TreeSchema for RangeInclusive<T> {
422 const SCHEMA: &'static Schema = Range::<T>::SCHEMA;
423}
424
425impl<T: TreeSerialize> TreeSerialize for RangeInclusive<T> {
426 #[inline]
427 fn serialize_by_key<S: Serializer>(
428 &self,
429 mut keys: impl Keys,
430 ser: S,
431 ) -> Result<S::Ok, SerdeError<S::Error>> {
432 match Self::SCHEMA.next(&mut keys)? {
433 0 => self.start(),
434 1 => self.end(),
435 _ => unreachable!(),
436 }
437 .serialize_by_key(keys, ser)
438 }
439}
440
441impl<T: TreeSchema> TreeSchema for RangeFrom<T> {
444 const SCHEMA: &'static Schema = &Schema::named(&[Named::new("start", T::SCHEMA)]);
445}
446
447impl<T: TreeSerialize> TreeSerialize for RangeFrom<T> {
448 #[inline]
449 fn serialize_by_key<S: Serializer>(
450 &self,
451 mut keys: impl Keys,
452 ser: S,
453 ) -> Result<S::Ok, SerdeError<S::Error>> {
454 match Self::SCHEMA.next(&mut keys)? {
455 0 => self.start.serialize_by_key(keys, ser),
456 _ => unreachable!(),
457 }
458 }
459}
460
461impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for RangeFrom<T> {
462 #[inline]
463 fn deserialize_by_key<D: Deserializer<'de>>(
464 &mut self,
465 mut keys: impl Keys,
466 de: D,
467 ) -> Result<(), SerdeError<D::Error>> {
468 match Self::SCHEMA.next(&mut keys)? {
469 0 => self.start.deserialize_by_key(keys, de),
470 _ => unreachable!(),
471 }
472 }
473
474 #[inline]
475 fn probe_by_key<D: Deserializer<'de>>(
476 mut keys: impl Keys,
477 de: D,
478 ) -> Result<(), SerdeError<D::Error>> {
479 match Self::SCHEMA.next(&mut keys)? {
480 0 => T::probe_by_key(keys, de),
481 _ => unreachable!(),
482 }
483 }
484}
485
486impl<T: TreeAny> TreeAny for RangeFrom<T> {
487 #[inline]
488 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
489 match Self::SCHEMA.next(&mut keys)? {
490 0 => self.start.ref_any_by_key(keys),
491 _ => unreachable!(),
492 }
493 }
494
495 #[inline]
496 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
497 match Self::SCHEMA.next(&mut keys)? {
498 0 => self.start.mut_any_by_key(keys),
499 _ => unreachable!(),
500 }
501 }
502}
503
504impl<T: TreeSchema> TreeSchema for RangeTo<T> {
507 const SCHEMA: &'static Schema = &Schema::named(&[Named::new("end", T::SCHEMA)]);
508}
509
510impl<T: TreeSerialize> TreeSerialize for RangeTo<T> {
511 #[inline]
512 fn serialize_by_key<S: Serializer>(
513 &self,
514 mut keys: impl Keys,
515 ser: S,
516 ) -> Result<S::Ok, SerdeError<S::Error>> {
517 match Self::SCHEMA.next(&mut keys)? {
518 0 => self.end.serialize_by_key(keys, ser),
519 _ => unreachable!(),
520 }
521 }
522}
523
524impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for RangeTo<T> {
525 #[inline]
526 fn deserialize_by_key<D: Deserializer<'de>>(
527 &mut self,
528 mut keys: impl Keys,
529 de: D,
530 ) -> Result<(), SerdeError<D::Error>> {
531 match Self::SCHEMA.next(&mut keys)? {
532 0 => self.end.deserialize_by_key(keys, de),
533 _ => unreachable!(),
534 }
535 }
536
537 #[inline]
538 fn probe_by_key<D: Deserializer<'de>>(
539 mut keys: impl Keys,
540 de: D,
541 ) -> Result<(), SerdeError<D::Error>> {
542 match Self::SCHEMA.next(&mut keys)? {
543 0 => T::probe_by_key(keys, de),
544 _ => unreachable!(),
545 }
546 }
547}
548
549impl<T: TreeAny> TreeAny for RangeTo<T> {
550 #[inline]
551 fn ref_any_by_key(&self, mut keys: impl Keys) -> Result<&dyn Any, ValueError> {
552 match Self::SCHEMA.next(&mut keys)? {
553 0 => self.end.ref_any_by_key(keys),
554 _ => unreachable!(),
555 }
556 }
557
558 #[inline]
559 fn mut_any_by_key(&mut self, mut keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
560 match Self::SCHEMA.next(&mut keys)? {
561 0 => self.end.mut_any_by_key(keys),
562 _ => unreachable!(),
563 }
564 }
565}
566
567impl<T: TreeSchema> TreeSchema for Cell<T> {
570 const SCHEMA: &'static Schema = T::SCHEMA;
571}
572
573impl<T: TreeSerialize + Copy> TreeSerialize for Cell<T> {
574 #[inline]
575 fn serialize_by_key<S: Serializer>(
576 &self,
577 keys: impl Keys,
578 ser: S,
579 ) -> Result<S::Ok, SerdeError<S::Error>> {
580 self.get().serialize_by_key(keys, ser)
581 }
582}
583
584impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Cell<T> {
585 #[inline]
586 fn deserialize_by_key<D: Deserializer<'de>>(
587 &mut self,
588 keys: impl Keys,
589 de: D,
590 ) -> Result<(), SerdeError<D::Error>> {
591 self.get_mut().deserialize_by_key(keys, de)
592 }
593
594 #[inline]
595 fn probe_by_key<D: Deserializer<'de>>(
596 keys: impl Keys,
597 de: D,
598 ) -> Result<(), SerdeError<D::Error>> {
599 T::probe_by_key(keys, de)
600 }
601}
602
603impl<T: TreeAny> TreeAny for Cell<T> {
604 #[inline]
605 fn ref_any_by_key(&self, _keys: impl Keys) -> Result<&dyn Any, ValueError> {
606 Err(ValueError::Access("Can't leak out of Cell"))
607 }
608
609 #[inline]
610 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
611 self.get_mut().mut_any_by_key(keys)
612 }
613}
614
615impl<T: TreeSchema> TreeSchema for RefCell<T> {
618 const SCHEMA: &'static Schema = T::SCHEMA;
619}
620
621impl<T: TreeSerialize> TreeSerialize for RefCell<T> {
622 #[inline]
623 fn serialize_by_key<S: Serializer>(
624 &self,
625 keys: impl Keys,
626 ser: S,
627 ) -> Result<S::Ok, SerdeError<S::Error>> {
628 self.try_borrow()
629 .or(Err(ValueError::Access("Borrowed")))?
630 .serialize_by_key(keys, ser)
631 }
632}
633
634impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for RefCell<T> {
635 #[inline]
636 fn deserialize_by_key<D: Deserializer<'de>>(
637 &mut self,
638 keys: impl Keys,
639 de: D,
640 ) -> Result<(), SerdeError<D::Error>> {
641 self.get_mut().deserialize_by_key(keys, de)
642 }
643
644 #[inline]
645 fn probe_by_key<D: Deserializer<'de>>(
646 keys: impl Keys,
647 de: D,
648 ) -> Result<(), SerdeError<D::Error>> {
649 T::probe_by_key(keys, de)
650 }
651}
652
653impl<'a, 'de: 'a, T: TreeDeserialize<'de>> TreeDeserialize<'de> for &'a RefCell<T> {
654 #[inline]
655 fn deserialize_by_key<D: Deserializer<'de>>(
656 &mut self,
657 keys: impl Keys,
658 de: D,
659 ) -> Result<(), SerdeError<D::Error>> {
660 self.try_borrow_mut()
661 .or(Err(ValueError::Access("Borrowed")))?
662 .deserialize_by_key(keys, de)
663 }
664
665 #[inline]
666 fn probe_by_key<D: Deserializer<'de>>(
667 keys: impl Keys,
668 de: D,
669 ) -> Result<(), SerdeError<D::Error>> {
670 T::probe_by_key(keys, de)
671 }
672}
673
674impl<T: TreeAny> TreeAny for RefCell<T> {
675 #[inline]
676 fn ref_any_by_key(&self, _keys: impl Keys) -> Result<&dyn Any, ValueError> {
677 Err(ValueError::Access("Can't leak out of RefCell"))
678 }
679
680 #[inline]
681 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
682 self.get_mut().mut_any_by_key(keys)
683 }
684}
685
686#[cfg(feature = "alloc")]
689mod _alloc {
690 use super::*;
691 extern crate alloc;
692 use alloc::{
693 borrow::Cow,
694 boxed::Box,
695 rc::{Rc, Weak as RcWeak},
696 sync::{Arc, Weak as SyncWeak},
697 };
698
699 impl<T: TreeSchema> TreeSchema for Box<T> {
700 const SCHEMA: &'static Schema = T::SCHEMA;
701 }
702
703 impl<T: TreeSerialize> TreeSerialize for Box<T> {
704 #[inline]
705 fn serialize_by_key<S: Serializer>(
706 &self,
707 keys: impl Keys,
708 ser: S,
709 ) -> Result<S::Ok, SerdeError<S::Error>> {
710 (**self).serialize_by_key(keys, ser)
711 }
712 }
713
714 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Box<T> {
715 #[inline]
716 fn deserialize_by_key<D: Deserializer<'de>>(
717 &mut self,
718 keys: impl Keys,
719 de: D,
720 ) -> Result<(), SerdeError<D::Error>> {
721 (**self).deserialize_by_key(keys, de)
722 }
723
724 #[inline]
725 fn probe_by_key<D: Deserializer<'de>>(
726 keys: impl Keys,
727 de: D,
728 ) -> Result<(), SerdeError<D::Error>> {
729 T::probe_by_key(keys, de)
730 }
731 }
732
733 impl<T: TreeAny> TreeAny for Box<T> {
734 #[inline]
735 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
736 (**self).ref_any_by_key(keys)
737 }
738
739 #[inline]
740 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
741 (**self).mut_any_by_key(keys)
742 }
743 }
744
745 impl<T: TreeSchema + Clone> TreeSchema for Cow<'_, T> {
748 const SCHEMA: &'static Schema = T::SCHEMA;
749 }
750
751 impl<T: TreeSerialize + Clone> TreeSerialize for Cow<'_, T> {
752 #[inline]
753 fn serialize_by_key<S: Serializer>(
754 &self,
755 keys: impl Keys,
756 ser: S,
757 ) -> Result<S::Ok, SerdeError<S::Error>> {
758 (**self).serialize_by_key(keys, ser)
759 }
760 }
761
762 impl<'de, T: TreeDeserialize<'de> + Clone> TreeDeserialize<'de> for Cow<'_, T> {
763 #[inline]
764 fn deserialize_by_key<D: Deserializer<'de>>(
765 &mut self,
766 keys: impl Keys,
767 de: D,
768 ) -> Result<(), SerdeError<D::Error>> {
769 self.to_mut().deserialize_by_key(keys, de)
770 }
771
772 #[inline]
773 fn probe_by_key<D: Deserializer<'de>>(
774 keys: impl Keys,
775 de: D,
776 ) -> Result<(), SerdeError<D::Error>> {
777 T::probe_by_key(keys, de)
778 }
779 }
780
781 impl<T: TreeAny + Clone> TreeAny for Cow<'_, T> {
782 #[inline]
783 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
784 (**self).ref_any_by_key(keys)
785 }
786
787 #[inline]
788 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
789 self.to_mut().mut_any_by_key(keys)
790 }
791 }
792
793 impl<T: TreeSchema> TreeSchema for Rc<T> {
796 const SCHEMA: &'static Schema = T::SCHEMA;
797 }
798
799 impl<T: TreeSerialize> TreeSerialize for Rc<T> {
800 #[inline]
801 fn serialize_by_key<S: Serializer>(
802 &self,
803 keys: impl Keys,
804 ser: S,
805 ) -> Result<S::Ok, SerdeError<S::Error>> {
806 (**self).serialize_by_key(keys, ser)
807 }
808 }
809
810 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Rc<T> {
811 #[inline]
812 fn deserialize_by_key<D: Deserializer<'de>>(
813 &mut self,
814 keys: impl Keys,
815 de: D,
816 ) -> Result<(), SerdeError<D::Error>> {
817 Rc::get_mut(self)
818 .ok_or(ValueError::Access("Reference is taken"))?
819 .deserialize_by_key(keys, de)
820 }
821
822 #[inline]
823 fn probe_by_key<D: Deserializer<'de>>(
824 keys: impl Keys,
825 de: D,
826 ) -> Result<(), SerdeError<D::Error>> {
827 T::probe_by_key(keys, de)
828 }
829 }
830
831 impl<T: TreeAny> TreeAny for Rc<T> {
832 #[inline]
833 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
834 (**self).ref_any_by_key(keys)
835 }
836
837 #[inline]
838 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
839 Rc::get_mut(self)
840 .ok_or(ValueError::Access("Reference is taken"))?
841 .mut_any_by_key(keys)
842 }
843 }
844
845 impl<T: TreeSchema> TreeSchema for RcWeak<T> {
848 const SCHEMA: &'static Schema = T::SCHEMA;
849 }
850
851 impl<T: TreeSerialize> TreeSerialize for RcWeak<T> {
852 #[inline]
853 fn serialize_by_key<S: Serializer>(
854 &self,
855 keys: impl Keys,
856 ser: S,
857 ) -> Result<S::Ok, SerdeError<S::Error>> {
858 self.upgrade()
859 .ok_or(ValueError::Absent)?
860 .serialize_by_key(keys, ser)
861 }
862 }
863
864 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for RcWeak<T> {
865 #[inline]
866 fn deserialize_by_key<D: Deserializer<'de>>(
867 &mut self,
868 keys: impl Keys,
869 de: D,
870 ) -> Result<(), SerdeError<D::Error>> {
871 self.upgrade()
872 .ok_or(ValueError::Absent)?
873 .deserialize_by_key(keys, de)
874 }
875
876 #[inline]
877 fn probe_by_key<D: Deserializer<'de>>(
878 keys: impl Keys,
879 de: D,
880 ) -> Result<(), SerdeError<D::Error>> {
881 T::probe_by_key(keys, de)
882 }
883 }
884
885 impl<T: TreeSchema> TreeSchema for Arc<T> {
888 const SCHEMA: &'static Schema = T::SCHEMA;
889 }
890
891 impl<T: TreeSerialize> TreeSerialize for Arc<T> {
892 #[inline]
893 fn serialize_by_key<S: Serializer>(
894 &self,
895 keys: impl Keys,
896 ser: S,
897 ) -> Result<S::Ok, SerdeError<S::Error>> {
898 (**self).serialize_by_key(keys, ser)
899 }
900 }
901
902 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Arc<T> {
903 #[inline]
904 fn deserialize_by_key<D: Deserializer<'de>>(
905 &mut self,
906 keys: impl Keys,
907 de: D,
908 ) -> Result<(), SerdeError<D::Error>> {
909 Arc::get_mut(self)
910 .ok_or(ValueError::Access("Reference is taken"))?
911 .deserialize_by_key(keys, de)
912 }
913
914 #[inline]
915 fn probe_by_key<D: Deserializer<'de>>(
916 keys: impl Keys,
917 de: D,
918 ) -> Result<(), SerdeError<D::Error>> {
919 T::probe_by_key(keys, de)
920 }
921 }
922
923 impl<T: TreeAny> TreeAny for Arc<T> {
924 #[inline]
925 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
926 (**self).ref_any_by_key(keys)
927 }
928
929 #[inline]
930 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
931 Arc::get_mut(self)
932 .ok_or(ValueError::Access("Reference is taken"))?
933 .mut_any_by_key(keys)
934 }
935 }
936
937 impl<T: TreeSchema> TreeSchema for SyncWeak<T> {
940 const SCHEMA: &'static Schema = T::SCHEMA;
941 }
942
943 impl<T: TreeSerialize> TreeSerialize for SyncWeak<T> {
944 #[inline]
945 fn serialize_by_key<S: Serializer>(
946 &self,
947 keys: impl Keys,
948 ser: S,
949 ) -> Result<S::Ok, SerdeError<S::Error>> {
950 self.upgrade()
951 .ok_or(ValueError::Absent)?
952 .serialize_by_key(keys, ser)
953 }
954 }
955
956 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for SyncWeak<T> {
957 #[inline]
958 fn deserialize_by_key<D: Deserializer<'de>>(
959 &mut self,
960 keys: impl Keys,
961 de: D,
962 ) -> Result<(), SerdeError<D::Error>> {
963 self.upgrade()
964 .ok_or(ValueError::Absent)?
965 .deserialize_by_key(keys, de)
966 }
967
968 #[inline]
969 fn probe_by_key<D: Deserializer<'de>>(
970 keys: impl Keys,
971 de: D,
972 ) -> Result<(), SerdeError<D::Error>> {
973 T::probe_by_key(keys, de)
974 }
975 }
976}
977
978#[cfg(feature = "std")]
981mod _std {
982 use super::*;
983 use std::sync::{Mutex, RwLock};
984
985 impl<T: TreeSchema> TreeSchema for Mutex<T> {
986 const SCHEMA: &'static Schema = T::SCHEMA;
987 }
988
989 impl<T: TreeSerialize> TreeSerialize for Mutex<T> {
990 #[inline]
991 fn serialize_by_key<S: Serializer>(
992 &self,
993 keys: impl Keys,
994 ser: S,
995 ) -> Result<S::Ok, SerdeError<S::Error>> {
996 self.lock()
997 .or(Err(ValueError::Access("Poisoned")))?
998 .serialize_by_key(keys, ser)
999 }
1000 }
1001
1002 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for Mutex<T> {
1003 #[inline]
1004 fn deserialize_by_key<D: Deserializer<'de>>(
1005 &mut self,
1006 keys: impl Keys,
1007 de: D,
1008 ) -> Result<(), SerdeError<D::Error>> {
1009 self.get_mut()
1010 .or(Err(ValueError::Access("Poisoned")))?
1011 .deserialize_by_key(keys, de)
1012 }
1013
1014 #[inline]
1015 fn probe_by_key<D: Deserializer<'de>>(
1016 keys: impl Keys,
1017 de: D,
1018 ) -> Result<(), SerdeError<D::Error>> {
1019 T::probe_by_key(keys, de)
1020 }
1021 }
1022
1023 impl<'a, 'de: 'a, T: TreeDeserialize<'de>> TreeDeserialize<'de> for &'a Mutex<T> {
1024 #[inline]
1025 fn deserialize_by_key<D: Deserializer<'de>>(
1026 &mut self,
1027 keys: impl Keys,
1028 de: D,
1029 ) -> Result<(), SerdeError<D::Error>> {
1030 (*self)
1031 .lock()
1032 .or(Err(ValueError::Access("Poisoned")))?
1033 .deserialize_by_key(keys, de)
1034 }
1035
1036 #[inline]
1037 fn probe_by_key<D: Deserializer<'de>>(
1038 keys: impl Keys,
1039 de: D,
1040 ) -> Result<(), SerdeError<D::Error>> {
1041 T::probe_by_key(keys, de)
1042 }
1043 }
1044
1045 impl<T: TreeAny> TreeAny for Mutex<T> {
1046 #[inline]
1047 fn ref_any_by_key(&self, _keys: impl Keys) -> Result<&dyn Any, ValueError> {
1048 Err(ValueError::Access("Can't leak out of Mutex"))
1049 }
1050
1051 #[inline]
1052 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
1053 self.get_mut()
1054 .or(Err(ValueError::Access("Poisoned")))?
1055 .mut_any_by_key(keys)
1056 }
1057 }
1058
1059 impl<T: TreeSchema> TreeSchema for RwLock<T> {
1062 const SCHEMA: &'static Schema = T::SCHEMA;
1063 }
1064
1065 impl<T: TreeSerialize> TreeSerialize for RwLock<T> {
1066 #[inline]
1067 fn serialize_by_key<S: Serializer>(
1068 &self,
1069 keys: impl Keys,
1070 ser: S,
1071 ) -> Result<S::Ok, SerdeError<S::Error>> {
1072 self.read()
1073 .or(Err(ValueError::Access("Poisoned")))?
1074 .serialize_by_key(keys, ser)
1075 }
1076 }
1077
1078 impl<'a, 'de: 'a, T: TreeDeserialize<'de>> TreeDeserialize<'de> for &'a RwLock<T> {
1079 #[inline]
1080 fn deserialize_by_key<D: Deserializer<'de>>(
1081 &mut self,
1082 keys: impl Keys,
1083 de: D,
1084 ) -> Result<(), SerdeError<D::Error>> {
1085 self.write()
1086 .or(Err(ValueError::Access("Poisoned")))?
1087 .deserialize_by_key(keys, de)
1088 }
1089
1090 #[inline]
1091 fn probe_by_key<D: Deserializer<'de>>(
1092 keys: impl Keys,
1093 de: D,
1094 ) -> Result<(), SerdeError<D::Error>> {
1095 T::probe_by_key(keys, de)
1096 }
1097 }
1098
1099 impl<'de, T: TreeDeserialize<'de>> TreeDeserialize<'de> for RwLock<T> {
1100 #[inline]
1101 fn deserialize_by_key<D: Deserializer<'de>>(
1102 &mut self,
1103 keys: impl Keys,
1104 de: D,
1105 ) -> Result<(), SerdeError<D::Error>> {
1106 self.get_mut()
1107 .or(Err(ValueError::Access("Poisoned")))?
1108 .deserialize_by_key(keys, de)
1109 }
1110
1111 #[inline]
1112 fn probe_by_key<D: Deserializer<'de>>(
1113 keys: impl Keys,
1114 de: D,
1115 ) -> Result<(), SerdeError<D::Error>> {
1116 T::probe_by_key(keys, de)
1117 }
1118 }
1119
1120 impl<T: TreeAny> TreeAny for RwLock<T> {
1121 #[inline]
1122 fn ref_any_by_key(&self, _keys: impl Keys) -> Result<&dyn Any, ValueError> {
1123 Err(ValueError::Access("Can't leak out of RwLock"))
1124 }
1125
1126 #[inline]
1127 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
1128 self.get_mut()
1129 .or(Err(ValueError::Access("Poisoned")))?
1130 .mut_any_by_key(keys)
1131 }
1132 }
1133}
1134
1135macro_rules! impl_newtype {
1139 (($gen:ident), $ty:ty) => {
1140 impl<$gen: TreeSchema> TreeSchema for $ty {
1141 const SCHEMA: &'static Schema = $gen::SCHEMA;
1142 }
1143
1144 impl<$gen: TreeSerialize> TreeSerialize for $ty {
1145 #[inline]
1146 fn serialize_by_key<S: Serializer>(
1147 &self,
1148 keys: impl Keys,
1149 ser: S,
1150 ) -> Result<S::Ok, SerdeError<S::Error>> {
1151 self.0.serialize_by_key(keys, ser)
1152 }
1153 }
1154
1155 impl<'de, $gen: TreeDeserialize<'de>> TreeDeserialize<'de> for $ty {
1156 #[inline]
1157 fn deserialize_by_key<D: Deserializer<'de>>(
1158 &mut self,
1159 keys: impl Keys,
1160 de: D,
1161 ) -> Result<(), SerdeError<D::Error>> {
1162 self.0.deserialize_by_key(keys, de)
1163 }
1164
1165 #[inline]
1166 fn probe_by_key<D: Deserializer<'de>>(
1167 keys: impl Keys,
1168 de: D,
1169 ) -> Result<(), SerdeError<D::Error>> {
1170 $gen::probe_by_key(keys, de)
1171 }
1172 }
1173
1174 impl<$gen: TreeAny> TreeAny for $ty {
1175 #[inline]
1176 fn ref_any_by_key(&self, keys: impl Keys) -> Result<&dyn Any, ValueError> {
1177 self.0.ref_any_by_key(keys)
1178 }
1179
1180 #[inline]
1181 fn mut_any_by_key(&mut self, keys: impl Keys) -> Result<&mut dyn Any, ValueError> {
1182 self.0.mut_any_by_key(keys)
1183 }
1184 }
1185 };
1186}
1187
1188impl_newtype! {(T), core::num::Wrapping<T>}