1#![cfg_attr(not(feature = "std"), no_std)]
213#![warn(
214 clippy::all,
215 clippy::dbg_macro,
216 clippy::todo,
217 clippy::empty_enum,
218 clippy::enum_glob_use,
219 clippy::mem_forget,
220 clippy::unused_self,
221 clippy::filter_map_next,
222 clippy::needless_continue,
223 clippy::needless_borrow,
224 clippy::match_wildcard_for_single_variants,
225 clippy::if_let_mutex,
226 clippy::mismatched_target_os,
227 clippy::await_holding_lock,
228 clippy::match_on_vec_items,
229 clippy::imprecise_flops,
230 clippy::suboptimal_flops,
231 clippy::lossy_float_literal,
232 clippy::rest_pat_in_fully_bound_structs,
233 clippy::fn_params_excessive_bools,
234 clippy::exit,
235 clippy::inefficient_to_string,
236 clippy::linkedlist,
237 clippy::macro_use_imports,
238 clippy::option_option,
239 clippy::verbose_file_reads,
240 clippy::unnested_or_patterns,
241 clippy::str_to_string,
242 rust_2018_idioms,
243 future_incompatible,
244 nonstandard_style,
245 missing_debug_implementations,
246 )]
248#![deny(unreachable_pub)]
249#![allow(
250 elided_lifetimes_in_paths,
251 clippy::type_complexity,
252 clippy::not_unsafe_ptr_arg_deref,
254)]
255#![forbid(unsafe_code)]
256#![cfg_attr(docsrs, feature(doc_auto_cfg, doc_cfg))]
257#![cfg_attr(test, allow(clippy::float_cmp))]
258
259extern crate alloc;
260
261use alloc::borrow::Cow;
262use alloc::borrow::ToOwned;
263use alloc::boxed::Box;
264use alloc::string::String;
265use core::any::Any;
266use core::any::TypeId;
267use core::fmt;
268
269use crate::enum_::VariantField;
270use crate::enum_::VariantKind;
271
272macro_rules! trivial_reflect_methods {
273 () => {
274 fn type_descriptor(
275 &self,
276 ) -> alloc::borrow::Cow<'static, $crate::type_info::TypeDescriptor> {
277 <Self as $crate::type_info::DescribeType>::type_descriptor()
278 }
279
280 fn as_any(&self) -> &dyn Any {
281 self
282 }
283
284 fn as_any_mut(&mut self) -> &mut dyn Any {
285 self
286 }
287
288 fn as_reflect(&self) -> &dyn Reflect {
289 self
290 }
291
292 fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
293 self
294 }
295 };
296}
297
298pub mod array;
300
301pub mod enum_;
303
304pub mod get_field;
306
307pub mod iter;
309
310pub mod key_path;
312
313pub mod list;
315
316pub mod map;
318
319pub mod struct_;
321
322pub mod tuple;
324
325pub mod tuple_struct;
327
328pub mod type_info;
330
331pub mod value;
333
334pub mod try_visit;
335
336mod foreign_impls;
337mod reflect_eq;
338
339pub use reflect_eq::reflect_eq;
340
341#[cfg(feature = "std")]
342#[cfg(test)]
343mod tests;
344
345#[doc(inline)]
346pub use mirror_mirror_macros::*;
347
348#[doc(inline)]
349pub use self::array::Array;
350#[doc(inline)]
351pub use self::enum_::Enum;
352#[doc(inline)]
353pub use self::get_field::GetField;
354#[doc(inline)]
355pub use self::get_field::GetFieldMut;
356#[doc(inline)]
357pub use self::list::List;
358#[doc(inline)]
359pub use self::map::Map;
360#[doc(inline)]
361pub use self::struct_::Struct;
362#[doc(inline)]
363pub use self::tuple::Tuple;
364#[doc(inline)]
365pub use self::tuple_struct::TupleStruct;
366#[doc(inline)]
367pub use self::type_info::DescribeType;
368#[doc(inline)]
369pub use self::type_info::TypeDescriptor;
370#[doc(inline)]
371pub use self::value::Value;
372
373pub(crate) static STATIC_RANDOM_STATE: ahash::RandomState = ahash::RandomState::with_seeds(
374 0x86c11a44c63f4f2f,
375 0xaf04d821054d02b3,
376 0x98f0a276c462acc1,
377 0xe2d6368e09c9c079,
378);
379
380pub trait Reflect: Any + Send + 'static {
382 fn type_descriptor(&self) -> Cow<'static, TypeDescriptor>;
383
384 fn as_any(&self) -> &dyn Any;
385
386 fn as_any_mut(&mut self) -> &mut dyn Any;
387
388 fn as_reflect(&self) -> &dyn Reflect;
389
390 fn as_reflect_mut(&mut self) -> &mut dyn Reflect;
391
392 fn reflect_owned(self: Box<Self>) -> ReflectOwned;
393
394 fn reflect_ref(&self) -> ReflectRef<'_>;
395
396 fn reflect_mut(&mut self) -> ReflectMut<'_>;
397
398 fn patch(&mut self, value: &dyn Reflect);
399
400 fn to_value(&self) -> Value;
401
402 fn clone_reflect(&self) -> Box<dyn Reflect>;
403
404 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
405
406 fn type_id(&self) -> TypeId {
407 TypeId::of::<Self>()
408 }
409
410 fn type_name(&self) -> &str {
411 core::any::type_name::<Self>()
412 }
413
414 fn into_tuple(self: Box<Self>) -> Option<Box<dyn Tuple>> {
415 self.reflect_owned().into_tuple()
416 }
417
418 fn as_tuple(&self) -> Option<&dyn Tuple> {
419 self.reflect_ref().as_tuple()
420 }
421
422 fn as_tuple_mut(&mut self) -> Option<&mut dyn Tuple> {
423 self.reflect_mut().as_tuple_mut()
424 }
425
426 fn into_struct(self: Box<Self>) -> Option<Box<dyn Struct>> {
427 self.reflect_owned().into_struct()
428 }
429
430 fn as_struct(&self) -> Option<&dyn Struct> {
431 self.reflect_ref().as_struct()
432 }
433
434 fn as_struct_mut(&mut self) -> Option<&mut dyn Struct> {
435 self.reflect_mut().as_struct_mut()
436 }
437
438 fn into_tuple_struct(self: Box<Self>) -> Option<Box<dyn TupleStruct>> {
439 self.reflect_owned().into_tuple_struct()
440 }
441
442 fn as_tuple_struct(&self) -> Option<&dyn TupleStruct> {
443 self.reflect_ref().as_tuple_struct()
444 }
445
446 fn as_tuple_struct_mut(&mut self) -> Option<&mut dyn TupleStruct> {
447 self.reflect_mut().as_tuple_struct_mut()
448 }
449
450 fn into_enum(self: Box<Self>) -> Option<Box<dyn Enum>> {
451 self.reflect_owned().into_enum()
452 }
453
454 fn as_enum(&self) -> Option<&dyn Enum> {
455 self.reflect_ref().as_enum()
456 }
457
458 fn as_enum_mut(&mut self) -> Option<&mut dyn Enum> {
459 self.reflect_mut().as_enum_mut()
460 }
461
462 fn into_list(self: Box<Self>) -> Option<Box<dyn List>> {
463 self.reflect_owned().into_list()
464 }
465
466 fn as_list(&self) -> Option<&dyn List> {
467 self.reflect_ref().as_list()
468 }
469
470 fn as_list_mut(&mut self) -> Option<&mut dyn List> {
471 self.reflect_mut().as_list_mut()
472 }
473
474 fn into_array(self: Box<Self>) -> Option<Box<dyn Array>> {
475 self.reflect_owned().into_array()
476 }
477
478 fn as_array(&self) -> Option<&dyn Array> {
479 self.reflect_ref().as_array()
480 }
481
482 fn as_array_mut(&mut self) -> Option<&mut dyn Array> {
483 self.reflect_mut().as_array_mut()
484 }
485
486 fn into_map(self: Box<Self>) -> Option<Box<dyn Map>> {
487 self.reflect_owned().into_map()
488 }
489
490 fn as_map(&self) -> Option<&dyn Map> {
491 self.reflect_ref().as_map()
492 }
493
494 fn as_map_mut(&mut self) -> Option<&mut dyn Map> {
495 self.reflect_mut().as_map_mut()
496 }
497
498 fn into_scalar(self: Box<Self>) -> Option<ScalarOwned> {
499 self.reflect_owned().into_scalar()
500 }
501
502 fn as_scalar(&self) -> Option<ScalarRef<'_>> {
503 self.reflect_ref().as_scalar()
504 }
505
506 fn as_scalar_mut(&mut self) -> Option<ScalarMut<'_>> {
507 self.reflect_mut().as_scalar_mut()
508 }
509}
510
511impl dyn Reflect {
512 pub fn downcast_ref<T>(&self) -> Option<&T>
513 where
514 T: Reflect,
515 {
516 self.as_any().downcast_ref::<T>()
517 }
518
519 pub fn downcast_mut<T>(&mut self) -> Option<&mut T>
520 where
521 T: Reflect,
522 {
523 self.as_any_mut().downcast_mut::<T>()
524 }
525}
526
527impl ToOwned for dyn Reflect {
528 type Owned = Box<dyn Reflect>;
529
530 fn to_owned(&self) -> Self::Owned {
531 self.clone_reflect()
532 }
533}
534
535impl fmt::Debug for dyn Reflect {
536 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
537 self.debug(f)
538 }
539}
540
541impl PartialEq for dyn Reflect {
542 fn eq(&self, other: &Self) -> bool {
543 reflect_eq(self, other).unwrap_or(false)
544 }
545}
546
547macro_rules! impl_for_core_types {
548 ($($ty:ident)*) => {
549 $(
550 impl Reflect for $ty {
551 trivial_reflect_methods!();
552
553 fn patch(&mut self, value: &dyn Reflect) {
554 if let Some(value) = value.as_any().downcast_ref::<Self>() {
555 *self = value.clone();
556 }
557 }
558
559 fn clone_reflect(&self) -> Box<dyn Reflect> {
560 Box::new(self.clone())
561 }
562
563 fn to_value(&self) -> Value {
564 Value::from(self.to_owned())
565 }
566
567 fn reflect_owned(self: Box<Self>) -> ReflectOwned {
568 ReflectOwned::Scalar(ScalarOwned::from(*self))
569 }
570
571 fn reflect_ref(&self) -> ReflectRef<'_> {
572 ReflectRef::Scalar(ScalarRef::from(*self))
573 }
574
575 fn reflect_mut(&mut self) -> ReflectMut<'_> {
576 ReflectMut::Scalar(ScalarMut::from(self))
577 }
578
579 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
580 if f.alternate() {
581 write!(f, "{:#?}", self)
582 } else {
583 write!(f, "{:?}", self)
584 }
585 }
586 }
587
588 impl FromReflect for $ty {
589 fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
590 Some(reflect.downcast_ref::<$ty>()?.clone())
591 }
592 }
593
594 impl From<$ty> for ScalarOwned {
595 fn from(value: $ty) -> Self {
596 ScalarOwned::$ty(value)
597 }
598 }
599
600 impl From<$ty> for ScalarRef<'static> {
601 fn from(value: $ty) -> Self {
602 ScalarRef::$ty(value)
603 }
604 }
605
606 impl<'a> From<&'a mut $ty> for ScalarMut<'a> {
607 fn from(value: &'a mut $ty) -> Self {
608 ScalarMut::$ty(value)
609 }
610 }
611 )*
612 };
613}
614
615impl_for_core_types! {
616 usize u8 u16 u32 u64 u128
617 i8 i16 i32 i64 i128
618 f32 f64
619 bool char
620}
621
622impl Reflect for String {
623 trivial_reflect_methods!();
624
625 fn patch(&mut self, value: &dyn Reflect) {
626 if let Some(value) = value.as_any().downcast_ref::<Self>() {
627 *self = value.clone();
628 }
629 }
630
631 fn clone_reflect(&self) -> Box<dyn Reflect> {
632 Box::new(self.clone())
633 }
634
635 fn to_value(&self) -> Value {
636 Value::from(self.to_owned())
637 }
638
639 fn reflect_owned(self: Box<Self>) -> ReflectOwned {
640 ReflectOwned::Scalar(ScalarOwned::from(*self))
641 }
642
643 fn reflect_ref(&self) -> ReflectRef<'_> {
644 ReflectRef::Scalar(ScalarRef::from(self))
645 }
646
647 fn reflect_mut(&mut self) -> ReflectMut<'_> {
648 ReflectMut::Scalar(ScalarMut::String(self))
649 }
650
651 fn debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
652 if f.alternate() {
653 write!(f, "{self:#?}")
654 } else {
655 write!(f, "{self:?}")
656 }
657 }
658}
659
660impl FromReflect for String {
661 fn from_reflect(reflect: &dyn Reflect) -> Option<Self> {
662 Some(reflect.downcast_ref::<String>()?.clone())
663 }
664}
665
666impl From<String> for ScalarOwned {
667 fn from(value: String) -> Self {
668 ScalarOwned::String(value)
669 }
670}
671
672impl<'a> From<&'a String> for ScalarRef<'a> {
673 fn from(value: &'a String) -> Self {
674 ScalarRef::String(value)
675 }
676}
677
678impl<'a> From<&'a mut String> for ScalarMut<'a> {
679 fn from(value: &'a mut String) -> Self {
680 ScalarMut::String(value)
681 }
682}
683
684pub trait FromReflect: Reflect + Sized {
688 fn from_reflect(reflect: &dyn Reflect) -> Option<Self>;
689}
690
691#[derive(Debug)]
695pub enum ReflectOwned {
696 Struct(Box<dyn Struct>),
697 TupleStruct(Box<dyn TupleStruct>),
698 Tuple(Box<dyn Tuple>),
699 Enum(Box<dyn Enum>),
700 Array(Box<dyn Array>),
701 List(Box<dyn List>),
702 Map(Box<dyn Map>),
703 Scalar(ScalarOwned),
704 Opaque(Box<dyn Reflect>),
707}
708
709impl ReflectOwned {
710 pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
711 match self {
712 ReflectOwned::Struct(inner) => inner.as_reflect_mut(),
713 ReflectOwned::TupleStruct(inner) => inner.as_reflect_mut(),
714 ReflectOwned::Tuple(inner) => inner.as_reflect_mut(),
715 ReflectOwned::Enum(inner) => inner.as_reflect_mut(),
716 ReflectOwned::Array(inner) => inner.as_reflect_mut(),
717 ReflectOwned::List(inner) => inner.as_reflect_mut(),
718 ReflectOwned::Map(inner) => inner.as_reflect_mut(),
719 ReflectOwned::Scalar(inner) => inner.as_reflect_mut(),
720 ReflectOwned::Opaque(inner) => inner.as_reflect_mut(),
721 }
722 }
723
724 pub fn as_reflect(&self) -> &dyn Reflect {
725 match self {
726 ReflectOwned::Struct(inner) => inner.as_reflect(),
727 ReflectOwned::TupleStruct(inner) => inner.as_reflect(),
728 ReflectOwned::Tuple(inner) => inner.as_reflect(),
729 ReflectOwned::Enum(inner) => inner.as_reflect(),
730 ReflectOwned::Array(inner) => inner.as_reflect(),
731 ReflectOwned::List(inner) => inner.as_reflect(),
732 ReflectOwned::Map(inner) => inner.as_reflect(),
733 ReflectOwned::Scalar(inner) => inner.as_reflect(),
734 ReflectOwned::Opaque(inner) => inner.as_reflect(),
735 }
736 }
737
738 pub fn into_tuple(self) -> Option<Box<dyn Tuple>> {
739 match self {
740 Self::Tuple(inner) => Some(inner),
741 _ => None,
742 }
743 }
744
745 pub fn into_struct(self) -> Option<Box<dyn Struct>> {
746 match self {
747 Self::Struct(inner) => Some(inner),
748 _ => None,
749 }
750 }
751
752 pub fn into_tuple_struct(self) -> Option<Box<dyn TupleStruct>> {
753 match self {
754 Self::TupleStruct(inner) => Some(inner),
755 _ => None,
756 }
757 }
758
759 pub fn into_enum(self) -> Option<Box<dyn Enum>> {
760 match self {
761 Self::Enum(inner) => Some(inner),
762 _ => None,
763 }
764 }
765
766 pub fn into_list(self) -> Option<Box<dyn List>> {
767 match self {
768 Self::List(inner) => Some(inner),
769 _ => None,
770 }
771 }
772
773 pub fn into_array(self) -> Option<Box<dyn Array>> {
774 match self {
775 Self::Array(inner) => Some(inner),
776 _ => None,
777 }
778 }
779
780 pub fn into_map(self) -> Option<Box<dyn Map>> {
781 match self {
782 Self::Map(inner) => Some(inner),
783 _ => None,
784 }
785 }
786
787 pub fn into_scalar(self) -> Option<ScalarOwned> {
788 match self {
789 Self::Scalar(inner) => Some(inner),
790 _ => None,
791 }
792 }
793
794 pub fn into_opaque(self) -> Option<Box<dyn Reflect>> {
795 match self {
796 Self::Opaque(inner) => Some(inner),
797 _ => None,
798 }
799 }
800}
801
802impl Clone for ReflectOwned {
803 fn clone(&self) -> Self {
804 match self {
805 Self::Struct(inner) => inner.clone_reflect().reflect_owned(),
806 Self::TupleStruct(inner) => inner.clone_reflect().reflect_owned(),
807 Self::Tuple(inner) => inner.clone_reflect().reflect_owned(),
808 Self::Enum(inner) => inner.clone_reflect().reflect_owned(),
809 Self::Array(inner) => inner.clone_reflect().reflect_owned(),
810 Self::List(inner) => inner.clone_reflect().reflect_owned(),
811 Self::Map(inner) => inner.clone_reflect().reflect_owned(),
812 Self::Opaque(inner) => inner.clone_reflect().reflect_owned(),
813 Self::Scalar(inner) => Self::Scalar(inner.clone()),
814 }
815 }
816}
817
818#[derive(Debug, Clone)]
820#[allow(non_camel_case_types)]
821#[cfg_attr(feature = "speedy", derive(speedy::Readable, speedy::Writable))]
822#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
823pub enum ScalarOwned {
824 usize(usize),
825 u8(u8),
826 u16(u16),
827 u32(u32),
828 u64(u64),
829 u128(u128),
830 i8(i8),
831 i16(i16),
832 i32(i32),
833 i64(i64),
834 i128(i128),
835 bool(bool),
836 char(char),
837 f32(f32),
838 f64(f64),
839 String(String),
840}
841
842impl ScalarOwned {
843 pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
844 match self {
845 ScalarOwned::usize(inner) => inner,
846 ScalarOwned::u8(inner) => inner,
847 ScalarOwned::u16(inner) => inner,
848 ScalarOwned::u32(inner) => inner,
849 ScalarOwned::u64(inner) => inner,
850 ScalarOwned::u128(inner) => inner,
851 ScalarOwned::i8(inner) => inner,
852 ScalarOwned::i16(inner) => inner,
853 ScalarOwned::i32(inner) => inner,
854 ScalarOwned::i64(inner) => inner,
855 ScalarOwned::i128(inner) => inner,
856 ScalarOwned::bool(inner) => inner,
857 ScalarOwned::char(inner) => inner,
858 ScalarOwned::f32(inner) => inner,
859 ScalarOwned::f64(inner) => inner,
860 ScalarOwned::String(inner) => inner,
861 }
862 }
863
864 pub fn as_reflect(&self) -> &dyn Reflect {
865 match self {
866 ScalarOwned::usize(inner) => inner,
867 ScalarOwned::u8(inner) => inner,
868 ScalarOwned::u16(inner) => inner,
869 ScalarOwned::u32(inner) => inner,
870 ScalarOwned::u64(inner) => inner,
871 ScalarOwned::u128(inner) => inner,
872 ScalarOwned::i8(inner) => inner,
873 ScalarOwned::i16(inner) => inner,
874 ScalarOwned::i32(inner) => inner,
875 ScalarOwned::i64(inner) => inner,
876 ScalarOwned::i128(inner) => inner,
877 ScalarOwned::bool(inner) => inner,
878 ScalarOwned::char(inner) => inner,
879 ScalarOwned::f32(inner) => inner,
880 ScalarOwned::f64(inner) => inner,
881 ScalarOwned::String(inner) => inner,
882 }
883 }
884}
885
886#[derive(Debug, Copy, Clone)]
890pub enum ReflectRef<'a> {
891 Struct(&'a dyn Struct),
892 TupleStruct(&'a dyn TupleStruct),
893 Tuple(&'a dyn Tuple),
894 Enum(&'a dyn Enum),
895 Array(&'a dyn Array),
896 List(&'a dyn List),
897 Map(&'a dyn Map),
898 Scalar(ScalarRef<'a>),
899 Opaque(&'a dyn Reflect),
902}
903
904impl<'a> ReflectRef<'a> {
905 pub fn as_reflect(&self) -> &dyn Reflect {
906 match self {
907 ReflectRef::Struct(inner) => inner.as_reflect(),
908 ReflectRef::TupleStruct(inner) => inner.as_reflect(),
909 ReflectRef::Tuple(inner) => inner.as_reflect(),
910 ReflectRef::Enum(inner) => inner.as_reflect(),
911 ReflectRef::Array(inner) => inner.as_reflect(),
912 ReflectRef::List(inner) => inner.as_reflect(),
913 ReflectRef::Map(inner) => inner.as_reflect(),
914 ReflectRef::Scalar(inner) => inner.as_reflect(),
915 ReflectRef::Opaque(inner) => inner.as_reflect(),
916 }
917 }
918
919 pub fn as_tuple(self) -> Option<&'a dyn Tuple> {
920 match self {
921 Self::Tuple(inner) => Some(inner),
922 _ => None,
923 }
924 }
925
926 pub fn as_struct(self) -> Option<&'a dyn Struct> {
927 match self {
928 Self::Struct(inner) => Some(inner),
929 _ => None,
930 }
931 }
932
933 pub fn as_tuple_struct(self) -> Option<&'a dyn TupleStruct> {
934 match self {
935 Self::TupleStruct(inner) => Some(inner),
936 _ => None,
937 }
938 }
939
940 pub fn as_enum(self) -> Option<&'a dyn Enum> {
941 match self {
942 Self::Enum(inner) => Some(inner),
943 _ => None,
944 }
945 }
946
947 pub fn as_list(self) -> Option<&'a dyn List> {
948 match self {
949 Self::List(inner) => Some(inner),
950 _ => None,
951 }
952 }
953
954 pub fn as_array(self) -> Option<&'a dyn Array> {
955 match self {
956 Self::Array(inner) => Some(inner),
957 _ => None,
958 }
959 }
960
961 pub fn as_map(self) -> Option<&'a dyn Map> {
962 match self {
963 Self::Map(inner) => Some(inner),
964 _ => None,
965 }
966 }
967
968 pub fn as_scalar(self) -> Option<ScalarRef<'a>> {
969 match self {
970 Self::Scalar(inner) => Some(inner),
971 _ => None,
972 }
973 }
974
975 pub fn as_opaque(self) -> Option<&'a dyn Reflect> {
976 match self {
977 Self::Opaque(inner) => Some(inner),
978 _ => None,
979 }
980 }
981}
982
983#[derive(Debug, Copy, Clone, PartialEq)]
985#[allow(non_camel_case_types)]
986pub enum ScalarRef<'a> {
987 usize(usize),
988 u8(u8),
989 u16(u16),
990 u32(u32),
991 u64(u64),
992 u128(u128),
993 i8(i8),
994 i16(i16),
995 i32(i32),
996 i64(i64),
997 i128(i128),
998 bool(bool),
999 char(char),
1000 f32(f32),
1001 f64(f64),
1002 String(&'a String),
1003}
1004
1005impl<'a> ScalarRef<'a> {
1006 pub fn as_reflect(&self) -> &dyn Reflect {
1007 match self {
1008 ScalarRef::usize(inner) => inner,
1009 ScalarRef::u8(inner) => inner,
1010 ScalarRef::u16(inner) => inner,
1011 ScalarRef::u32(inner) => inner,
1012 ScalarRef::u64(inner) => inner,
1013 ScalarRef::u128(inner) => inner,
1014 ScalarRef::i8(inner) => inner,
1015 ScalarRef::i16(inner) => inner,
1016 ScalarRef::i32(inner) => inner,
1017 ScalarRef::i64(inner) => inner,
1018 ScalarRef::i128(inner) => inner,
1019 ScalarRef::bool(inner) => inner,
1020 ScalarRef::char(inner) => inner,
1021 ScalarRef::f32(inner) => inner,
1022 ScalarRef::f64(inner) => inner,
1023 ScalarRef::String(inner) => *inner,
1024 }
1025 }
1026}
1027
1028#[derive(Debug)]
1032pub enum ReflectMut<'a> {
1033 Struct(&'a mut dyn Struct),
1034 TupleStruct(&'a mut dyn TupleStruct),
1035 Tuple(&'a mut dyn Tuple),
1036 Enum(&'a mut dyn Enum),
1037 Array(&'a mut dyn Array),
1038 List(&'a mut dyn List),
1039 Map(&'a mut dyn Map),
1040 Scalar(ScalarMut<'a>),
1041 Opaque(&'a mut dyn Reflect),
1044}
1045
1046impl<'a> ReflectMut<'a> {
1047 pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
1048 match self {
1049 ReflectMut::Struct(inner) => inner.as_reflect_mut(),
1050 ReflectMut::TupleStruct(inner) => inner.as_reflect_mut(),
1051 ReflectMut::Tuple(inner) => inner.as_reflect_mut(),
1052 ReflectMut::Enum(inner) => inner.as_reflect_mut(),
1053 ReflectMut::Array(inner) => inner.as_reflect_mut(),
1054 ReflectMut::List(inner) => inner.as_reflect_mut(),
1055 ReflectMut::Map(inner) => inner.as_reflect_mut(),
1056 ReflectMut::Scalar(inner) => inner.as_reflect_mut(),
1057 ReflectMut::Opaque(inner) => inner.as_reflect_mut(),
1058 }
1059 }
1060
1061 pub fn as_reflect(&self) -> &dyn Reflect {
1062 match self {
1063 ReflectMut::Struct(inner) => inner.as_reflect(),
1064 ReflectMut::TupleStruct(inner) => inner.as_reflect(),
1065 ReflectMut::Tuple(inner) => inner.as_reflect(),
1066 ReflectMut::Enum(inner) => inner.as_reflect(),
1067 ReflectMut::Array(inner) => inner.as_reflect(),
1068 ReflectMut::List(inner) => inner.as_reflect(),
1069 ReflectMut::Map(inner) => inner.as_reflect(),
1070 ReflectMut::Scalar(inner) => inner.as_reflect(),
1071 ReflectMut::Opaque(inner) => inner.as_reflect(),
1072 }
1073 }
1074
1075 pub fn as_tuple_mut(self) -> Option<&'a mut dyn Tuple> {
1076 match self {
1077 Self::Tuple(inner) => Some(inner),
1078 _ => None,
1079 }
1080 }
1081
1082 pub fn as_struct_mut(self) -> Option<&'a mut dyn Struct> {
1083 match self {
1084 Self::Struct(inner) => Some(inner),
1085 _ => None,
1086 }
1087 }
1088
1089 pub fn as_tuple_struct_mut(self) -> Option<&'a mut dyn TupleStruct> {
1090 match self {
1091 Self::TupleStruct(inner) => Some(inner),
1092 _ => None,
1093 }
1094 }
1095
1096 pub fn as_enum_mut(self) -> Option<&'a mut dyn Enum> {
1097 match self {
1098 Self::Enum(inner) => Some(inner),
1099 _ => None,
1100 }
1101 }
1102
1103 pub fn as_list_mut(self) -> Option<&'a mut dyn List> {
1104 match self {
1105 Self::List(inner) => Some(inner),
1106 _ => None,
1107 }
1108 }
1109
1110 pub fn as_array_mut(self) -> Option<&'a mut dyn Array> {
1111 match self {
1112 Self::Array(inner) => Some(inner),
1113 _ => None,
1114 }
1115 }
1116
1117 pub fn as_map_mut(self) -> Option<&'a mut dyn Map> {
1118 match self {
1119 Self::Map(inner) => Some(inner),
1120 _ => None,
1121 }
1122 }
1123
1124 pub fn as_scalar_mut(self) -> Option<ScalarMut<'a>> {
1125 match self {
1126 Self::Scalar(inner) => Some(inner),
1127 _ => None,
1128 }
1129 }
1130
1131 pub fn as_opaque_mut(self) -> Option<&'a mut dyn Reflect> {
1132 match self {
1133 Self::Opaque(inner) => Some(inner),
1134 _ => None,
1135 }
1136 }
1137}
1138
1139#[derive(Debug)]
1141#[allow(non_camel_case_types)]
1142pub enum ScalarMut<'a> {
1143 usize(&'a mut usize),
1144 u8(&'a mut u8),
1145 u16(&'a mut u16),
1146 u32(&'a mut u32),
1147 u64(&'a mut u64),
1148 u128(&'a mut u128),
1149 i8(&'a mut i8),
1150 i16(&'a mut i16),
1151 i32(&'a mut i32),
1152 i64(&'a mut i64),
1153 i128(&'a mut i128),
1154 bool(&'a mut bool),
1155 char(&'a mut char),
1156 f32(&'a mut f32),
1157 f64(&'a mut f64),
1158 String(&'a mut String),
1159}
1160
1161impl<'a> ScalarMut<'a> {
1162 pub fn as_reflect_mut(&mut self) -> &mut dyn Reflect {
1163 match self {
1164 ScalarMut::usize(inner) => *inner,
1165 ScalarMut::u8(inner) => *inner,
1166 ScalarMut::u16(inner) => *inner,
1167 ScalarMut::u32(inner) => *inner,
1168 ScalarMut::u64(inner) => *inner,
1169 ScalarMut::u128(inner) => *inner,
1170 ScalarMut::i8(inner) => *inner,
1171 ScalarMut::i16(inner) => *inner,
1172 ScalarMut::i32(inner) => *inner,
1173 ScalarMut::i64(inner) => *inner,
1174 ScalarMut::i128(inner) => *inner,
1175 ScalarMut::bool(inner) => *inner,
1176 ScalarMut::char(inner) => *inner,
1177 ScalarMut::f32(inner) => *inner,
1178 ScalarMut::f64(inner) => *inner,
1179 ScalarMut::String(inner) => *inner,
1180 }
1181 }
1182
1183 pub fn as_reflect(&self) -> &dyn Reflect {
1184 match self {
1185 ScalarMut::usize(inner) => *inner,
1186 ScalarMut::u8(inner) => *inner,
1187 ScalarMut::u16(inner) => *inner,
1188 ScalarMut::u32(inner) => *inner,
1189 ScalarMut::u64(inner) => *inner,
1190 ScalarMut::u128(inner) => *inner,
1191 ScalarMut::i8(inner) => *inner,
1192 ScalarMut::i16(inner) => *inner,
1193 ScalarMut::i32(inner) => *inner,
1194 ScalarMut::i64(inner) => *inner,
1195 ScalarMut::i128(inner) => *inner,
1196 ScalarMut::bool(inner) => *inner,
1197 ScalarMut::char(inner) => *inner,
1198 ScalarMut::f32(inner) => *inner,
1199 ScalarMut::f64(inner) => *inner,
1200 ScalarMut::String(inner) => *inner,
1201 }
1202 }
1203}
1204
1205pub fn reflect_debug(value: &dyn Reflect, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1207 fn scalar_debug(
1208 scalar: &dyn core::fmt::Debug,
1209 f: &mut core::fmt::Formatter<'_>,
1210 ) -> fmt::Result {
1211 if f.alternate() {
1212 write!(f, "{scalar:#?}")
1213 } else {
1214 write!(f, "{scalar:?}")
1215 }
1216 }
1217
1218 match value.reflect_ref() {
1219 ReflectRef::Struct(inner) => {
1220 let mut f = f.debug_struct(inner.type_name());
1221 for (name, value) in inner.fields() {
1222 f.field(name, &value as &dyn ::core::fmt::Debug);
1223 }
1224 f.finish()
1225 }
1226 ReflectRef::TupleStruct(inner) => {
1227 let mut f = f.debug_tuple(inner.type_name());
1228 for field in inner.fields() {
1229 f.field(&field as &dyn ::core::fmt::Debug);
1230 }
1231 f.finish()
1232 }
1233 ReflectRef::Tuple(inner) => {
1234 let mut f = f.debug_tuple("");
1235 for field in inner.fields() {
1236 f.field(&field as &dyn ::core::fmt::Debug);
1237 }
1238 f.finish()
1239 }
1240 ReflectRef::Enum(inner) => match inner.variant_kind() {
1241 VariantKind::Struct => {
1242 let mut f = f.debug_struct(inner.variant_name());
1243 for field in inner.fields() {
1244 match field {
1245 VariantField::Struct(name, value) => {
1246 f.field(name, &value as &dyn ::core::fmt::Debug);
1247 }
1248 VariantField::Tuple { .. } => {
1249 unreachable!("unit variant yielded struct field")
1250 }
1251 }
1252 }
1253 f.finish()
1254 }
1255 VariantKind::Tuple => {
1256 let mut f = f.debug_tuple(inner.variant_name());
1257 for field in inner.fields() {
1258 match field {
1259 VariantField::Struct { .. } => {
1260 unreachable!("unit variant yielded struct field")
1261 }
1262 VariantField::Tuple(value) => {
1263 f.field(&value as &dyn ::core::fmt::Debug);
1264 }
1265 }
1266 }
1267 f.finish()
1268 }
1269 VariantKind::Unit => write!(f, "{}", inner.variant_name()),
1270 },
1271 ReflectRef::Array(inner) => f.debug_list().entries(inner.iter()).finish(),
1272 ReflectRef::List(inner) => f.debug_list().entries(inner.iter()).finish(),
1273 ReflectRef::Map(inner) => f.debug_map().entries(inner.iter()).finish(),
1274 ReflectRef::Scalar(inner) => match inner {
1275 ScalarRef::usize(inner) => scalar_debug(&inner, f),
1276 ScalarRef::u8(inner) => scalar_debug(&inner, f),
1277 ScalarRef::u16(inner) => scalar_debug(&inner, f),
1278 ScalarRef::u32(inner) => scalar_debug(&inner, f),
1279 ScalarRef::u64(inner) => scalar_debug(&inner, f),
1280 ScalarRef::u128(inner) => scalar_debug(&inner, f),
1281 ScalarRef::i8(inner) => scalar_debug(&inner, f),
1282 ScalarRef::i16(inner) => scalar_debug(&inner, f),
1283 ScalarRef::i32(inner) => scalar_debug(&inner, f),
1284 ScalarRef::i64(inner) => scalar_debug(&inner, f),
1285 ScalarRef::i128(inner) => scalar_debug(&inner, f),
1286 ScalarRef::bool(inner) => scalar_debug(&inner, f),
1287 ScalarRef::char(inner) => scalar_debug(&inner, f),
1288 ScalarRef::f32(inner) => scalar_debug(&inner, f),
1289 ScalarRef::f64(inner) => scalar_debug(&inner, f),
1290 ScalarRef::String(inner) => scalar_debug(&inner, f),
1291 },
1292 ReflectRef::Opaque(_) => {
1293 write!(f, "{}", value.type_name())
1294 }
1295 }
1296}
1297
1298#[doc(hidden)]
1300pub mod __private {
1301 pub use alloc::borrow::Cow;
1302 pub use alloc::collections::BTreeMap;
1303 pub use core::any::Any;
1304 pub use core::any::TypeId;
1305 pub use core::fmt;
1306
1307 pub use once_cell::race::OnceBox;
1308
1309 pub use self::enum_::*;
1310 pub use self::key_path::{
1311 field, get, variant, Breadcrumbs, GetPath, GetTypePath, IntoKeyOrIndex, Key, KeyPath,
1312 NamedOrNumbered,
1313 };
1314 pub use self::struct_::{Struct, StructValue};
1315 pub use self::tuple::{Tuple, TupleValue};
1316 pub use self::tuple_struct::{TupleStruct, TupleStructValue};
1317 pub use self::value::*;
1318 pub use crate::iter::*;
1319 pub use crate::type_info::graph::*;
1320 pub use crate::*;
1321
1322 pub trait IntoValue {
1323 fn into_value(self) -> Value;
1324 }
1325
1326 impl<R> IntoValue for R
1327 where
1328 R: Reflect,
1329 {
1330 fn into_value(self) -> Value {
1331 self.to_value()
1332 }
1333 }
1334
1335 impl IntoValue for &str {
1336 fn into_value(self) -> Value {
1337 self.to_owned().into_value()
1338 }
1339 }
1340}