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